2012-02-24 223 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字段。