一尘不染

LINQ to等同于sql``带有领带的OP(n)''的实体。

sql

我最近一直在 sql server中 搜索LINQ等效项WITH TIES,遇到了两件事,这证明是无用的。 __

我知道这个问题以前曾被提出过,并且得到了公认的答案,但是它并不能像领带 一样
起作用。采用该解决方案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)将会导致一个:MamuziKamala一个
Tom Jerry)它应该包括 BOTH

我知道没有内置的等效项,我已经找到了实现它的方法。我不知道这是否是最好的方法并为其他解决方案打开大门。


阅读 164

收藏
2021-03-10

共1个答案

一尘不染

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 iToList() 之间放置一个OrderBy(s => s.Score)。 __

我无法检查我的linq子句将生成什么sql语句。但是我认为您的答案要好得多。您的问题也很好。我从来没有想过在linq中保持联系。;)

基本上,它仅从第一个列表中获得前3个得分,并将它们与整个列表进行比较,而我仅获得与第一个列表中的得分相等的那些得分。

2021-03-10