有了EF,当你分组时,那是一个投影吗?如何加入列

时间:2013-06-19 17:40:51

标签: c# linq entity-framework

如果我有这样的查询:

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?

1 个答案:

答案 0 :(得分:1)

  

因此,当我分组时,我似乎必须使用'into'关键字   猜测会做某种投射吗?

有两个纯投影算子 - SelectSelectMany

  

现在我不确定如何引用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