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」キーワードを使用する必要があるようです。これは、ある種の射影を行うと思いますか?

と の 2 つの純粋な射影演算子がありSelectますSelectMany

j1.Username、j2.pointsを参照する方法がわかりませんか?

j1エンティティのみを含むグループがあります。そして、各グループはj1エンティティのコレクションです。結果を集計できます。ただし、ユーザー名を取得できる単一のj1エンティティはありません。したがって、j1のグループがあり、 j2またはj3にアクセスできません。あなたの結合は、ポイントと住所によってユーザーをフィルタリングするためだけに使用されました。その後、ユーザーのみを照会し続けました。

「キー」プロパティがあるようですが、列に移動できません。

キー プロパティは、各グループのキーです。あなたの場合、グループ内のすべてのユーザーで同じ 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;

ところで、ユーザー、ポイント、アドレスにup、およびa変数を使用しないのはなぜですか? なぜj1j2j3 ?

于 2013-06-19T17:51:17.293 に答える