2012-02-24 221 views
1

我有一個表'a',帶有id和時間戳。另一個表'b'有N個指向id的多行,每行有'type'和'其他一些數據'。如何編寫LINQ查詢將多行組合成一行?

我想LINQ查詢產生單列與ID,時間戳,以及「其他一些數據」×N.像這樣:


    1 | 4671 | 46.5 | 56.5 

,其中46.5是從「B」的一行,而56.5則來自另一行;兩個都有相同的ID。

我在SQLite中有一個工作查詢,但我是LINQ的新手。我不知道從哪裏開始 - 我不認爲這是一個JOIN。


    SELECT 
     a.id as id, 
     a.seconds, 
     COALESCE(
     (SELECT b.some_data FROM 
      b WHERE 
      b.id=a.id AND b.type=1), '') AS 'data_one', 
     COALESCE(
     (SELECT b.some_data FROM 
      b WHERE 
      b.id=a.id AND b.type=2), '') AS 'data_two' 

     FROM a first 
     WHERE first.id=1 
     GROUP BY first.ID 

回答

2

你沒有提到你是否使用Linq到sql或linq到實體。但是下面的查詢應該得到ü有

(from x in a 
join y in b on x.id equals y.id 
select new{x.id, x.seconds, y.some_data, y.type}).GroupBy(x=>new{x.id,x.seconds}). 
Select(x=>new{ 
    id = x.key.id, 
    seconds = x.Key.seconds, 
    data_one = x.Where(z=>z.type == 1).Select(g=>g.some_data).FirstOrDefault(), 
    data_two = x.Where(z=>z.type == 2).Select(g=>g.some_data).FirstOrDefault() 
}); 

很顯然,你有這取決於底層提供的DataContext或ObjectContext的前綴你的表名。

+0

這個答案幫了我更多,但都很有用。但是,我寫的LINQ查詢不適用於SQLite atm。不確定它是我的LINQ查詢還是DBLinq驅動程序。 – ahnkle 2012-02-29 13:44:53

0

你想要做什麼與pivoting類似,請參閱Is it possible to Pivot data using LINQ?。這裏的區別在於你並不需要進行聚合(就像標準數據透視一樣),所以你需要使用Max或者類似的方法來模擬選擇一個varchar字段。