如何对来自相同IQueryable的不同行进行分组

时间:2012-07-02 19:45:59

标签: c# iqueryable

我有一个IQueryable,其中包含我的应用程序中的使用数据列表。其中的每一行都是表中的单独条目。结构就像这样

{

Usagedata

用户名(字符串)
SessionId(字符串)
PartOfAppAccessed

键(int),
名称(字符串),
描述(字符串)
时间(日期时间)

}

但是在显示这些数据时,我想根据会话ID对行进行分组。所以我的输出必须在这个结构中

{

Usagedata

用户名(字符串)
SessionId(字符串)
时间(日期时间)
PartOfAppAccessed

键(int),
名称(字符串),
描述(字符串)
时间(日期时间)
),


键(int),
名称(字符串),
描述(字符串)
时间(日期时间)
),

键(int),
名称(字符串),
描述(字符串)
时间(日期时间)

}

所以我的问题是 - 如何基于某些条件(例如在这种情况下常见的sessionId)对来自同一IQueryable的不同行进行分组?

1 个答案:

答案 0 :(得分:1)

我想您希望基于UsageDataSessionId UserName IQueryable<UsageData> usageData = ... ; var groupedUsageData = usageData.GroupBy(x => new { x.SessionId, x.Username }); var singleGroup = groupedUsageData.ElementAt(0); string sessionId = singleGroup.Key.SessionId; string name = singleGroup.Key.Name; IEnumerable<string> accessedAppsNames = singleGroup.Select(x => x.PartOfAppAccessed.Name); 个实例。代码:

SessionId

然后,您可以使用以下单个组:

Username

想到了一些注意事项:

  • 由于您可以直接将会话映射到用户,因此可能无需在UsageData对象中存储SessionIdUsageData。也许最好只存储Time并从其他表中获取用户名?
  • 分组Time包含PartOfAppAccessed属性没有意义。它有什么价值?在原始对象中(在进行分组之前),{{1}}属性仅在{{1}}对象上声明。