sql Top 1与System.Linq firstordefault

nkoocmlb  于 2023-04-09  发布在  其他
关注(0)|答案(4)|浏览(136)

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

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

例如:我有一个客户有3笔债务,所有的债务都有相同的余额。债务ID是:1,2,3
C#中与该查询等价的语句是:

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

债务代表客户3债务
有趣的部分是sql返回id为2的debt,而c#代码返回Id为1。Id为1对我来说是有意义的,但为了保持代码功能相同,我需要更改c#代码以返回中间值。
我不确定sql top 1背后的逻辑是什么,其中有几行与查询匹配。
查询将选择一个债务并更新数据库。
谢谢

a9wyjsp7

a9wyjsp71#

您可以启动SQL Profiler,执行存储过程,查看结果,然后捕获应用程序通过linq发送的查询,并再次查看结果。
此外,您可以轻松地查看过程的执行计划,并尝试对其进行优化,但使用linq查询,您无法轻松做到这一点。

70gysomp

70gysomp2#

请在firstordefault之前尝试Take(1)。

r8xiu3jd

r8xiu3jd3#

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

vxf3dgd4

vxf3dgd44#

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

相关问题