如果我有这样的查询:
var results = from j1 in context.users
join j2 in context.points on j1.UserId equals j2.UserId
join j3 in context.addresses on j1.UserId equals j3.UserId
select new { j1.Username, j2.points, j3.address1 }
现在,如果我想分组:
var results = from j1 in context.users
join j2 in context.points on j1.UserId equals j2.UserId
join j3 in context.addresses on j1.UserId equals j3.UserId
group j1 by j1.CountryCode into g1
select new { j1.Username, j2.points, j3.address1 }
所以当我分组时,似乎我必须使用'into'关键字,我想这会做某种投影吗?现在我不知道如何引用j1.Username,j2.points?我看到有一个'Key'属性,但这不允许我导航到列。
如何在分组后访问已加入的columsn?
答案 0 :(得分:1)
因此,当我分组时,我似乎必须使用'into'关键字 猜测会做某种投射吗?
有两个纯投影算子 - Select
和SelectMany
。
现在我不确定如何引用j1.Username,j2.points吧?
您有群组,仅包含 j1 实体。每个组都是 j1 实体的集合。您可以汇总结果。但是没有单个 j1 实体,你可以获得用户名。因此,您拥有 j1 组,您无法访问 j2 或 j3 。您的联接仅用于按点和地址过滤用户。之后,您继续只查询用户。
我看到有一个'Key'属性但是我不能导航到 列。
Key属性是每个组的关键。在您的情况下,它将是CountryCode,对于组中的所有用户都是相同的。
这是返回用户名,地址和总分的查询。这个怎么运作?首先,您通过简单连接加入用户和地址。但是您应该将结果投影到包含用户和答案的匿名对象中。否则,答案将从范围“丢失”,就像在原始查询中一样。到目前为止一切都很好 - 我们有用户和答案。现在我们需要总积分。对于此GroupJoin的使用 - 它不仅将用户地址对与点相关联,而且还将结果(即点)分组到points
组中。现在您可以访问所有数据 - 用户和地址位于ua
对象中,与用户相关的点位于points
组中。您可以计算总数:
from u in context.users
join a in context.addresses on u.UserId equals a.UserId
select new { u, a } into ua
join p in context.points on ua.u.UserId equals p.UserId into points
select new
{
ua.u.Username,
ua.u.CountryCode, // need for grouping by country
ua.a.address1,
Points = points.Sum()
}
// last grouping by country. You can omit it
into x
group x by x.CountryCode into g
select g;
BTW 为什么不为用户,点和地址使用 u , p 和 变量?为什么 j1 , j2 , j3 ?