c# - 我如何在 linq 中使用分组、不同和一起计数?

标签 c# .net linq linq-to-sql

我有一个 ActivityLog 表,其中一行对应网络应用程序中每个页面上的每次点击。该表具有以下相关字段:PageTitle、UserName、ActivityDate。我想添加一个带有 GridView 的使用历史页面,该页面具有以下列:页面标题、# Hits、# Unique Users。因此,对于应用程序中的每个页面,我们将显示点击总数以及点击该页面的唯一用户数。

我已经尝试了以下 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 次点击(用户 1 命中页面 1,用户 2 命中页面 2,用户 3 命中页面 3),我表中的所有三行都显示 3 的 NumUniqueUsers 列,即使它们应该显示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 个唯一用户,因此您的代码是正确的

关于c# - 我如何在 linq 中使用分组、不同和一起计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822642/

相关文章:

c# - 根据文本框的值动态更改标签的值 c# windows form

c# - 重命名特定类的库

.net - 具有 Appearance=Buttons 的 Windows TabControl,在右侧获得较大的边距

c# - 使用 LINQ with Action 删除旧文件

c# - 为什么要在 C# 中使用 Task<T> 而不是 ValueTask<T>?

c# - WPF - 旋转变换过渡

c# - 一种存储信息的方法

c# - LINQ:无法将类型 'System.Int32' 转换为类型 'System.Object'

c# - LINQ C# 复杂的嵌套结构

c# - MVC Controller 方法参数始终为空