我最近一直在 sql server中 搜索LINQ等效项WITH TIES,遇到了两件事,这证明是无用的。 __
LINQ
WITH TIES
我知道这个问题以前曾被提出过,并且得到了公认的答案,但是它并不能像领带 一样 起作用。采用该解决方案GroupBy()如预期不会导致TOP(3) WITH TIES考虑包括数据集{3 2 2 1 1 0}的结果集将是{3 2 2 1 1}它应该是{3 2 2}
GroupBy()
TOP(3) WITH TIES
{3 2 2 1 1 0}
{3 2 2 1 1}
{3 2 2}
使用以下样本数据(从此问题中获取):
CREATE TABLE Person ( Id int primary key, Name nvarchar(50), Score float ) INSERT INTO Person VALUES (1, 'Tom',8.9) INSERT INTO Person VALUES (2, 'Jerry',8.9) INSERT INTO Person VALUES (3, 'Sharti',7) INSERT INTO Person VALUES (4, 'Mamuzi',9) INSERT INTO Person VALUES (5, 'Kamala',9)
传统OrderByDescending(p => p.Score).Take(3)将会导致一个:Mamuzi,Kamala和 一个 Tom( 或 Jerry)它应该包括 BOTH
OrderByDescending(p => p.Score).Take(3)
Mamuzi
Kamala
Tom
Jerry
我知道没有内置的等效项,我已经找到了实现它的方法。我不知道这是否是最好的方法并为其他解决方案打开大门。
var query = (from q in list.OrderByDescending(s => s.Score).Take(3).Select(s => s.Score).Distinct() from i in list where q == i.Score select i).ToList();
编辑:
我不确定您想要的顺序,但是要更改顺序,可以在 select i 和 ToList() 之间放置一个OrderBy(s => s.Score)。 __
我无法检查我的linq子句将生成什么sql语句。但是我认为您的答案要好得多。您的问题也很好。我从来没有想过在linq中保持联系。;)
基本上,它仅从第一个列表中获得前3个得分,并将它们与整个列表进行比较,而我仅获得与第一个列表中的得分相等的那些得分。