[英]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()
};
在生成的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.