【问题标题】:How do I write a LINQ query to combine multiple rows into one row?如何编写 LINQ 查询以将多行合并为一行?
【发布时间】:2012-02-24 22:56:24
【问题描述】:

我有一个表,'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


    【解决方案1】:

    您没有提到您使用的是 Linq to sql 还是 linq to entity。但是下面的查询应该能让你到达那里

    (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,具体取决于底层提供者。

    【讨论】:

    • 这个答案对我帮助更大,但两者都很有用。但是,我编写的 LINQ 查询不适用于 SQLite atm。不确定是我的 LINQ 查询还是 DBLinq 驱动程序。
    【解决方案2】:

    您想要做的类似于旋转,请参阅Is it possible to Pivot data using LINQ?。这里的不同之处在于您实际上并不需要聚合(如标准数据透视表),因此您需要使用 Max 或一些可以模拟选择单个 varchar 字段的类似方法。

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      相关资源
      最近更新 更多