簡體   English   中英

如何在Linq to SQL中使用distinct with group

[英]How to use distinct with group by in 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,
        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]

我認為Basiclife很接近,但是檢查id是否為空可能不是問題或者足夠,你應該檢查以確保它在執行組之前不是null,因為你說它是一個可以為空的字段。 否則它看起來是正確的,如果你遇到問題,你可能有錯誤的數據,或者它是一個錯誤或沒有完全實現的Linq to SQL功能,你可能想嘗試Linq to Entity。

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()
        };

根據這篇文章,您的代碼看起來正確:

使用GROUP BY和COUNT(DISTINCT)的LINQ to SQL

您是否嘗試檢查生成的SQL?

在生成的SQL中似乎有一大堆goop來處理GroupID為NULL。 如果可能的話? 如果沒有,請嘗試更改定義以使其為NOT 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()
    };

您確定數據庫完整性正確嗎? 無論如何也許你應該嘗試這個:我不知道一個小組是如何空的,但這似乎是你的問題。

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() 
                     });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM