2010-08-08 40 views
7

Sử dụng LINQ to SQL làm cách nào để nhóm 2 bảng sau đây.LINQ - Nhóm theo nhiều bảng

Orders Bảng:

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

Calls Bảng:

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

Tôi muốn nhóm hai bảng theo ngày, quả:

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

Tôi biết cách nhóm một bàn duy nhất,

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

làm cách nào để nhóm cả hai? thx!

Trả lời

9

Vì cả hai bảng dường như có cấu trúc tương tự, tôi khuyên bạn nên chiếu cả hai vào một biểu mẫu tương đương và sau đó nhóm vào kết nối của hai bộ đó.

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)}; 

Do tính chất lười biếng của Linq2Sql, điều này thực sự có thể bị giảm xuống một truy vấn. Trong sự quan tâm của hiệu suất tôi sẽ đảm bảo đây không phải là một truy vấn từ địa ngục.

+0

bạn có thể cho tôi một ví dụ không? – dano

+0

thx! , tôi đã hy vọng tôi có thể sử dụng lệnh linq/sql thường xuyên, tôi đã không suy nghĩ về concating hai bảng. bạn sẽ làm tương tự nếu điều này là TSQL đơn giản? – dano

+0

Trong TSQL tôi muốn sử dụng một tham gia bên ngoài đầy đủ, nhưng điều này không phải là dễ dàng trong L2S, tôi hy vọng các giải pháp tôi cung cấp là đơn giản hơn bằng cách viết một tham gia bên ngoài đầy đủ. Chỉ cần tìm kiếm SO nếu bạn muốn biết thêm thông tin về cách sử dụng FOJ trong LINQ. –

1

Bạn có thể sử dụng phương pháp 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); 
    } 

này rất giống với SQL bạn sẽ viết (một sự kết hợp của hai bảng, và sau đó một truy vấn bên ngoài để hợp nhất các kết quả vào một hàng)

+0

thx thats thực sự tương tự như "Johannes Rudolph" câu trả lời. – dano

+0

Vâng, nhưng có nhiều khả năng dẫn đến một câu lệnh SQL đơn. Tốt nhất để đặt cả hai vào và nhìn vào trình gỡ rối :) –

+1

im nhận "Tất cả các truy vấn được kết hợp bằng toán tử UNION, INTERSECT hoặc EXCEPT phải có số biểu thức bằng nhau trong danh sách đích", nghĩ rằng nếu bảng có truy vấn ngày khác nhau sẽ Thất bại – dano

Các vấn đề liên quan