如何编写 LINQ 查询以将多行合并为一行?

问题描述 投票:0回答:2

我有一个表“a”,带有 id 和时间戳。另一个表“b”有 N 多行引用 id,每行都有“type”和“一些其他数据”。

我希望 LINQ 查询生成一个单行,其中包含 id、时间戳和“一些其他数据”x 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
linq sqlite
2个回答
2
投票

您没有提到您是否使用 Linq to SQL 还是 linq toEntity。但是,以下查询应该可以帮助您:

(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 旋转数据?。这里的区别在于,您实际上并不需要聚合(如标准枢轴),因此您需要使用 Max 或一些类似的方法来模拟选择单个 varchar 字段。

© www.soinside.com 2019 - 2024. All rights reserved.