0

如果我有这样的查询:

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 了??我看到有一个“键”属性,但它不允许我导航到列。

分组后如何访问加入的列?

4

1 回答 1

1

所以当我分组时,似乎我必须使用'into'关键字,我猜它会进行某种投影?

有两个纯投影运算符 -SelectSelectMany

现在我不确定如何引用 j1.Username, j2.points 现在?

您有组,其中仅包含j1实体。每个组都是j1实体的集合。您可以汇总结果。但是没有一个j1实体,您可以获取其用户名。因此,您有j1组,您无法访问j2j3。您的加入仅用于按点和地址过滤用户。之后,您继续只查询用户。

我看到有一个“键”属性,但它不允许我导航到列。

键属性是每个组的键。在您的情况下,它将是 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;

顺便说一句,为什么不使用upa变量作为用户、点和地址?为什么j1j2j3

于 2013-06-19T17:51:17.293 回答