sql Top 1 vs System.Linq firstordefault

时间:2013-03-26 14:26:03

标签: c# sql linq

我在c#中重写一个SProc。问题是在SProc中有一个像这样的查询:

select top 1 *
from ClientDebt
where ClinetID = 11234
order by Balance desc

例如:我有一个有3个债务的客户,所有债务都有相同的余额。债务标识是:1,2,3

c#等效于该查询:

debts.OrderByDescending(d => d.Balance)
     .FirstOrDefault()

债务代表客户3债务

有趣的是,sql返回ID为Id 2,但c#代码返回Id 1。 Id 1对我有意义但是为了保持代码功能相同,我需要更改c#代码以返回中间代码。

我不确定sql top 1背后的逻辑是什么,其中几行与查询匹配。

查询将选择一个债务并更新数据库。我想linq用sql返回相同的结果

由于

3 个答案:

答案 0 :(得分:0)

debts.OrderByDescending(d => d.Balance).ThenByDescending(d => d.Id)
     .FirstOrDefault()

答案 1 :(得分:0)

您可以启动SQL事件探查器,执行存储过程,查看结果,然后捕获查询通过linq发送的应用程序,并再次查看结果。

此外,您可以轻松查看过程的执行计划,并尝试进行优化,但使用linq查询,您无法轻松完成此操作。

答案 2 :(得分:-3)

AFAIK,在SQL中如果选择没有ORDER BY的行,它会根据主键对结果集进行排序。 使用Order BY CLAUSE [field],隐式下一个订单是[primarykey]。