C# 如何在LINQtoSQL中使用distinct和GROUPBY

C# 如何在LINQtoSQL中使用distinct和GROUPBY,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,我正在尝试将以下sql转换为Linq 2 sql: select groupId, count(distinct(userId)) from processroundissueinstance group by groupId 这是我的密码: var q = from i in ProcessRoundIssueInstance group i by i.GroupID into g select new { Key = g.Key,

我正在尝试将以下sql转换为Linq 2 sql:

select groupId, count(distinct(userId)) from processroundissueinstance 
group by groupId
这是我的密码:

var q = from i in ProcessRoundIssueInstance
    group i by i.GroupID into g
    select new
    {
        Key = g.Key,
        Count = g.Select(x => x.UserID).Distinct().Count()
    };
当我运行代码时,我总是得到无效的GroupID。 有什么想法吗?看来,这家公司把事情搞砸了

以下是生成的sql:

SELECT [t1].[GroupID] AS [Key], (
SELECT COUNT(*)
FROM (
    SELECT DISTINCT [t2].[UserID]
    FROM [ProcessRoundIssueInstance] AS [t2]
    WHERE (([t1].[GroupID] IS NULL) AND ([t2].[GroupID] IS NULL)) 
       OR (([t1].[GroupID] IS NOT NULL) 
            AND ([t2].[GroupID] IS NOT NULL) 
            AND ([t1].[GroupID] = [t2].[GroupID]))
    ) AS [t3]
) AS [Count]
FROM (
    SELECT [t0].[GroupID]
    FROM [ProcessRoundIssueInstance] AS [t0]
    GROUP BY [t0].[GroupID]
    ) AS [t1]

根据本文,您的代码看起来是正确的:


您是否尝试过检查生成的SQL?

生成的SQL中似乎有一大堆错误,无法处理GroupID为NULL的问题。如果可能的话?如果不是,请尝试更改定义以使其不为NULL。

尝试使用where子句来消除连接后的虚假ID

var q = from i in ProcessRoundIssueInstance
    where i.GroupID != ""
    group i by i.GroupID into g
    select new
    {
        Key = g.Key,
        Count = g.Select(x => x.UserID).Distinct().Count()
    };

我认为Basiclife很接近,但检查id是否为空可能不是问题,或者还不够,您应该在创建组之前检查以确保它不为null,因为您说过它是一个可为null的字段。否则它看起来是正确的,如果您遇到问题,您可能有错误的数据,或者它是一个bug,或者没有完全实现LINQtoSQL的功能,您可能希望尝试LINQtoEntity

var q = from i in ProcessRoundIssueInstance
        where i.GroupID != null
        && i.GroupID != string.Empty
        group i by i.GroupID into g        
        select new
        {
            Key = g.Key,
            Count = g.Select(x => x.UserID).Distinct().Count()
        };

您确定数据库的完整性正确吗?无论如何,也许你应该试试这个: 我不知道一个小组怎么会是空的,但这似乎是你的问题

ProcessRoundIssueInstance.Where(i => i.GroupId != null)
    .GroupBy(i => i.GroupID)
    .Select(group => new 
                    { 
                      Key = group.Key,
                      Count = group.SingleOrDefault() == null ? 0 : 
                              group.SingleOrDefault().Select( item => item.UserID).Distinct().Count() 
                     });

是的,请看我的原始帖子,看看生成的无效sql。@Basiclife:FUBAR是怎么回事?在SQL中,NULL不等于任何值,包括NULL。如果两者都为NULL,
t1.GroupID=t2.GroupID
仍然为false。这是关联两个空字段的唯一方法。出于兴趣,是否有任何Id列可以故意为空?另外,能否根据调试器(而不是声明)告诉我们ProcessRoundIssueInstance的数据类型。谢谢,GroupID是可以为null的,但我也尝试了另一个不可以为null的列。System.Data.Linq.Table