【问题标题】:How to write SQL and LINQ to get the one record from a result with where condition?如何编写 SQL 和 LINQ 以从具有 where 条件的结果中获取一条记录?
【发布时间】:2013-08-02 12:08:03
【问题描述】:

假设我有一个包含数百万条记录的表 Tab1:

Tab1(id, id1,id2, value, ...)

使用 SQL 类似:

Select * from Tab1 Where id1=123;

我有 100 条记录。然后我想从这 100 条记录中获取一个具有最大 id 值的记录。

如何为此编写最简单的 SQL?

当我使用 EF 将此表与 EF 中的实体匹配时,如何编写 LINQ 以获得相同的结果?

【问题讨论】:

    标签: sql linq sql-server-2008 entity-framework sql-server-2008-r2


    【解决方案1】:

    这可以通过 ORDER BY 和 TOP 来完成。

    在 SQL 中:

    SELECT TOP 1 *
    FROM Tab1
    WHERE id1 = 123
    ORDER BY id desc
    

    在带有 EF 的 Linq 中:

    Tab1.Where(t => t.id1 == 123).OrderByDescending(t => t.id).FirstOrDefault();
    

    【讨论】:

    • 是的,你的解决方案更好,+1
    • 如果您在 id 列上有索引,则性能完全可以忽略不计。如果它是主键,那么它可能已经为您创建好了。
    【解决方案2】:

    我认为最简单的方法是这样的:

    Select * from Tab1 Where id1=123 AND id = (SELECT First(Max(id)) from Tab1 where id1 = 123)
    

    如果值不同,您可以删除 First(我不知道 Max 在有多行具有相同最大值时的行为)

    关于Linq,你可以使用类似于:

    Tab1.Where(t => t.id == 123).OrderByDescending(t => t.id).FirstOrDefault();
    

    【讨论】:

    • 谢谢。这就是我正在尝试的。 First 不适用于 SQL Server 2008。也许仅适用于 2010?我会试试你的 LINQ。再次感谢。
    • 这是来自 SQL Server 2008 表单“First”的错误消息:“First”不是可识别的内置函数名称。
    • 可以去掉第一个子句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2012-08-13
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2016-03-27
    相关资源
    最近更新 更多