【问题标题】:Lambda Expression Select Min and Max at the same timeLambda 表达式同时选择最小值和最大值
【发布时间】:2014-07-16 09:10:29
【问题描述】:

当同时选择两列时,如何将此代码转换为 Lambda 表达式?

LINQ

var lq=(from a in tbl
          group a by 0 into b
          select new { intYear = b.Min(p => p.intYear), tintMonth = b.Max(p => p.tintMonth) }
    ).SingleOrDefault();

T-SQL

SELECT MIN(intYear), MAX(tintMonth)
FROM tbl

Lambda 表达式

tbl.Select(x => x.intYear).Min();  //Can't figure how to select if 2 columns

【问题讨论】:

    标签: c# sql linq lambda


    【解决方案1】:

    如果您打算返回一个“行”而不是两个值,您可以像在第一个 LINQ 表达式中那样将所有行组合在一起:

    tbl.GroupBy(t => 1)
       .Select(g => new { intYear = g.Min(p => p.intYear), tintMonth = g.Max(p => p.tintMonth) })
    

    注意,我假设这是针对 LINQ-to-SQL 的。对于普通的旧对象,这很可能会导致对集合进行三次迭代。一个用于分组,一个用于Min(),一个用于Max()。对于大型集合,您最好循环一次,然后在集合上使用单个 foreach 以老式的方式执行此操作。

    【讨论】:

    • 感谢您的快速回复。在您的代码中,我看到了这一行 tbl.GroupBy(t => 1),这是什么目的?这是让我看到它实际上迭代 3 次的方式吗?我只是想知道你用来检查的方法,以便下次我编码时知道如何排除故障。
    • 它实际上与您的group a by 0 into b 完全相同,但用 1 而不是 0(真的没有理由)。
    • 好的,我也按照示例代码进行操作,但不确定它的用途。对于你上面提到的迭代,我不明白为什么要迭代,你能告诉我你是怎么发现的吗?
    • GroupBy 将对项目进行分组。它与 SQL GROUP BY 子句相同。在这种情况下,您将按一个常量进行分组,该常量强制将所有行组合成一个组。这模拟了当您使用没有任何特定分组的聚合函数时 RDBMS 所做的相同行为。但是,对于普通对象,没有神奇的 AFAIK 来检查所选项目是否为常量,因此对 GroupBy 的调用将迭代集合。然后对MinMax 的调用将分别迭代生成的组,从而导致三个循环。
    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 2021-08-14
    • 1970-01-01
    • 2014-12-01
    • 2011-12-14
    • 2016-02-15
    • 2020-08-19
    • 2020-05-16
    相关资源
    最近更新 更多