[英]How do I use grouping, distinct, and count together in linq?
我有一個ActivityLog表,其中有一個行針對Web應用程序中每個頁面上的每個命中。 該表具有以下相關字段:PageTitle,UserName,ActivityDate。 我想添加一個帶有GridView的“使用歷史記錄”頁面,該頁面具有以下列:頁面標題,#命中次數,#唯一用戶。 因此,對於應用程序中的每個頁面,我們將顯示總點擊數以及訪問該頁面的唯一身份用戶數。
我嘗試了以下linq,從搜索中可以發現,該linq應該可以正常工作:
var ual = (from activityLog in linqMetaData.UserActivityLog
group activityLog by activityLog.PageTitle into pageGroup
select new PageUsageStatistics()
{
PageTitle = pageGroup.Key,
NumHits = pageGroup.Count(),
NumUniqueUsers = pageGroup.Select(x => x.UserName).Distinct().Count()
});
NumHits返回預期的數目; 但是,NumUniqueUsers返回的是具有匹配的唯一用戶總數,而不是每個頁面的計數。 因此,如果我有3個用戶,每個用戶在各自不同的頁面上都有1個命中(User1命中Page1,User2命中Page2,而User3命中Page3),則表中的所有三行都將NumUniqueUsers列顯示3。 1。
有什么建議么?
謝謝克里斯
編輯-添加生成的SQL:
SELECT [LPA_L1].[PageName],
[LPA_L1].[NumHits],
[LPA_L1].[NumUniqueUsers]
FROM
(SELECT [LPA_L2].[PageTitle] AS [PageName],
[LPA_L2].[LPAV_] AS [NumHits],
(SELECT COUNT(*) AS [LPAV_]
FROM
(SELECT DISTINCT [LPA_L2].[UserPrincipleName]
FROM [USIC].[dbo].[UserActivityLog] [LPA_L2]
) [LPA_L3]) AS [NumUniqueUsers]
FROM
(SELECT [LPLA_1].[PageTitle],
COUNT(*) AS [LPAV_]
FROM [USIC].[dbo].[UserActivityLog] [LPLA_1]
GROUP BY [LPLA_1].[PageTitle]
) [LPA_L2]
) [LPA_L1]
ORDER BY [LPA_L1].[PageName] ASC
“ 3個用戶,每個用戶在3頁中的每一個上都有1個匹配項”
我將其解釋為意味着您的日志如下所示:
在這種情況下,每個頁面確實有3個唯一用戶,因此您的代碼是正確的
嘗試添加此擴展方法:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> knownKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
並像這樣使用它:
NumUniqueUsers = pageGroup.DistinctBy(x => x.UserName).Count();
很難說DISTINCT在哪里迷路了。 也許LinqToSql正在查詢翻譯中刪除它。 查看生成的sql將確認。
如果Distinct正在(意外地)被LinqToSql丟棄,則這是寫該部分查詢的另一種方法。
NumUniqueUsers = pageGroup.GroupBy(x => x.UserName).Count()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.