Linq-複数のテーブルによるグループ化

asp.net c# linq linq-to-sql
Linq-複数のテーブルによるグループ化

Linq to Sqlを使用して、次の2つのテーブルをグループ化する方法を教えてください。

注文表

CustomerID | Name   |Date
1          | order1 | 2010-01-01
2          | order2 | 2010-01-01
2          | order3 | 2010-04-01

コールテーブル

CustomerID | Name   |Date
1          | call1 | 2010-01-01
3          | call2 | 2010-06-01
2          | call3 | 2010-05-01

date、* Result *で2つのテーブルをグループ化します。

Date       | Orders | Calls
2010-01-01 | 2      | 1
2010-04-01 | 1      | 0
2010-05-01 | 0      | 1
2010-06-01 | 0      | 1

私は単一のテーブルをグループ化する方法を知っています、

from o in Orders
group o by o.Date.Date into og
select new {Date = og.Key,Orders= og.Count()};

両方をグループ化するにはどうすればよいですか? THX!

  7  2


ベストアンサー

両方のテーブルは似たような構造を持っているように見えるので、両方を同等の形式に投影し、それらの2つのセットを連結してグループ化することをお勧めします。

var orders = from o in Orders
            select new { IsOrder = true, o.Date };
var calls = from c in Calls
            select new { IsOrder = false, c.Date };

var result = from x in orders.Concat(calls)
            group x by x.Date into og
            select new {Date = og.Key, Orders= og.Count(o=>o.IsOrder), Calls = og.Count(c=>!c.IsTrue)};

Linq2Sqlのレイジーな性質により、これは実際には単一のクエリに削減される場合があります。 パフォーマンスのために、これが地獄からのクエリではないことを確認します。

9


Unionメソッドを使用できます。

    var result =
        (from c in Calls group c by c.Date into cg select new {Date = cg.Key, Calls = cg.Count(), Orders = 0})
        .Union(from o in Orders group o by o.Date into og select new {Date = og.Key, Calls = 0, Orders = og.Count()})
        .GroupBy(x => x.Date)
        .Select(g => new {Date = g.Key, Calls = g.Max(r => r.Calls), Orders = g.Max(r => r.Orders)});

    foreach (var row in result)
    {
        Trace.WriteLine(row);
    }

これは、記述するSQL(2つのテーブルの結合、および結果を行にマージする外部クエリ)に非常に似ています。

1


タイトルとURLをコピーしました