2010-08-08 108 views
7

使用LINQ到SQL我如何組的以下2個表。LINQ的 - 組由多個表

訂單表

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  | 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!

回答

9

由於這兩個表似乎有一個類似的結構,我建議將兩者都投影到一個等價的形式,然後在這兩個集合的連接上進行分組。

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的惰性,這實際上可能會減少爲單個查詢。爲了提高性能,我會確保這不是來自地獄的查詢。

+0

你可以給我一個例子嗎? – dano 2010-08-08 18:31:16

+0

thx! ,我希望我可以使用常規的LINQ/SQL命令,我沒有考慮將這兩個表格拼接起來。如果這是簡單的TSQL,你會這樣做嗎? – dano 2010-08-08 18:35:19

+0

在TSQL我會使用一個完全外部連接,但是這並不容易在L2S,我希望我提供的解決方案比寫一個完全外部連接簡單。如果您想了解更多關於如何在Linq中使用FOJ的信息,請搜索。我搜查了 – 2010-08-08 18:42:46

1

可以使用聯盟的方法:

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

+0

thx 這真的類似於「約翰內斯魯道夫」的答案。 – dano 2010-08-08 19:22:45

+0

是的,但它更可能導致一個SQL語句。最好把它們都放進去,看看調試器:) – 2010-08-08 19:30:20

+1

即時得到「所有使用UNION,INTERSECT或EXCEPT操作符組合的查詢在目標列表中必須具有相同數量的表達式」,認爲如果表有不同的日期,查詢將會失敗 – dano 2010-08-08 19:54:54