当前位置: 首页 > 编程语言 > C#

C#LearningTutorial-ConvertingSQLRank()toLINQ,oranAlternative分享

时间:2023-04-11 11:03:37 C#

ConvertingSQLRank()toLINQ,oranAlternative但我想将它翻译成LINQ语句(Lambda??),以便它适合我的DAL的其余部分。但我不知道如何在LINQ中模拟Rank()。我将它张贴在这里的原因(可能是错误的)是为了看看是否有人可以替换Rank()语句以便我可以切换它。或者,如果有一种方法可以在LINQ中表示Rank(),那也将不胜感激。使用CMOSELECTvp.[PersonID]AS[PersonId],ce.[EnrollmentID],vp.[FirstName],vp.[LastName],ce.[EnrollmentDate],ce.[DisenrollmentDate],wh.WorkerCategoryFROM[dbo].[vwPersonInfo]ASvpINNERJOIN([dbo].[tblCMOEnrollment]ASceLEFTOUTERJOIN(SELECT*,RANK()OVER(PARTITIONBYEnrollmentIDORDERBYCASEWHENEndDateISNULLTHEN1ELSE2END,EndDateDESC,StartDateDESC)ASwhrankFROM[dbo].[tblWorkerHistory]??WHEREWorkerCategory=2)ASwhONce.[EnrollmentID]=wh.[EnrollmentID]ANDwh.whrank=1)ONvp.[PersonID]=ce.[ClientID]WHERE(vp.LastNameNOTIN('Client','Orientation','Real','Training','Matrix','Second','Not'))AND((wh.[EndDate]=GetDate()))下面是一个展示如何在Linq中模拟Rank()的示例:标记>s.mark选择o).Count()+1};级别内置于LINQ中,但不包含在查询语法中。使用方法语法时,大多数linq函数有两个版本——普通版本和提供的类。一个简单的例子,它只选择所有其他学生并将结果序列中的索引添加到结果中:varq=class.student.OrderBy(s=>s.studentId).Where((s,i)=>i%2==0).Select((s,i)=>new{Name=s.Name,Rank=i}如果你想模拟排名那么你可以使用下面的linq查询。varq=(fromsinclass.studentselectnew{Name=s.Name,Rank=(fromoinclass.studentwhereo.Mark>s.Mark&&o.studentId==s.studentId选择o.Mark).Distinct().Count()+1}).ToList();你可以这样使用顺序:varq=(fromsinclass.studentorderbys.studentIdselectnew{Name=s.Name,Rank=(fromoinclass.studentwhereo.Mark>s.Mark&&o.studentId==s.studentIdselecto.Mark).Distinct().Count()+1}).ToList();但在此查询中,顺序无关紧要。基于@Totero'sanswer,butwithalamdaimplementation.更高的分数=更高的排名。varrankedData=data.Select(s=>new{Ranking=data.Count(x=>x.Value>s.Value)+1,Name=s.Key,Score=s.Value});对于这个输入:{100,100,98,97,97,97,91,50}你会得到这个输出:以上是C#学习教程:将SQLRank()转换为LINQ,或者替换的全部内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: