簡體   English   中英

如何在linq中使用分組,不同和一起計數?

[英]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個匹配項”

我將其解釋為意味着您的日志如下所示:

  • 用戶1-第1頁
  • 用戶1-第2頁
  • 用戶1-第3頁
  • 用戶2-第1頁
  • 用戶2-第2頁
  • 用戶2-第3頁
  • 用戶3-第1頁
  • 用戶3-第2頁
  • 用戶3-第3頁

在這種情況下,每個頁面確實有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.

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