【问题标题】:`SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant` as LINQ to SQL`SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant` 作为 LINQ to SQL
【发布时间】:2011-01-12 18:02:39
【问题描述】:

这个相当简单的 SQL 查询在从 LINQ 尝试时被证明是相当令人困惑的。

我有一个 SQL 表 Plant 与列 ZoneMin

我想找出列中值的最小值和最大值。
T-SQL 中的答案很简单:

SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant

什么是 LINQ 查询可以让我得到这个(或一些类似的)SQL?

我对 .Aggregate() 和 .GroupBy() 进行了各种尝试,但都没有成功。我还查看了几个看起来相似的 SO 问题。

这可以通过将方法应用于结果数组来简单地实现,但是当 T-SQL 中如此简单时,我不应该需要从每个 SQL 行传输一个值。

【问题讨论】:

    标签: .net linq linq-to-sql


    【解决方案1】:

    要获得与原始查询相同的性能,您需要使用分组(通过一个常量来最小化影响,例如0),以便您可以在同一查询中引用同一组记录两次.使用表名会导致在每个引用上生成一个新查询。请尝试以下操作:

    (from plant in db.Plants
     group plant by 0 into plants
     select new { Min = plants.Min(p => p.ZoneMin), Max = plants.Max(p => p.ZoneMin) }
    ).Single()
    

    这会产生以下查询:

    SELECT MIN(plants.ZoneMin), MAX(plants.ZoneMin)
    FROM (SELECT 0 AS Grp, ZoneMin FROM Plants) AS plants
    GROUP BY plants.Grp
    

    在优化器完成它之后,它会输出与您的查询等效的内容,至少根据 SQL Server Management Studio。

    【讨论】:

    • 干得好!谢谢阿隆。我倾向于忘记尝试“按常数分组”的技巧。
    • @Peter:那你在我前面 - 在研究你的问题之前,我什至没有听说过这个技巧。
    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 2011-11-20
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多