是否可以使用LINQ(到实体)执行此T-SQL查询
本文关键字:执行 T-SQL 查询 实体 可以使 LINQ 是否 | 更新日期: 2023-09-27 18:08:42
我正在尝试编写以下LINQ实体查询:
获取已回答的问题列表,按最近回答的排序
所以,基本上这是一个1..*之间的问题和答案。
所以我试着先用SQL编写查询,这样我就理解了它,下面是我想到的:
WITH [Answers] AS
(
SELECT QuestionId,
CreatedOn,
ROW_NUMBER() OVER
(
PARTITION BY QuestionId
ORDER BY CreatedOn DESC
) As [Rank]
FROM dbo.Answers
)
select a.*
from dbo.questions a
inner join answers on a.questionid = answers.questionid
where answers.rank = 1
order by answers.createdon desc
现在,我不知道是否可以用LINQ来做这件事。
当然,上面的查询可能是错误的,所以不要把它看作是一个简单的t-SQL到LINQ实体的转换。
我只是在寻找一种为上述需求编写LINQ实体查询的方法。
有什么想法吗?
编辑
以下是我迄今为止所尝试的:
var query = questions
.Where(q => q.Answers.Any())
.OrderByDescending(
q => q.Answers.OrderByDescending(
a => a.CreatedOn).FirstOrDefault());
我想只是希望。收到以下错误:
DbSortClause表达式必须具有可与顺序比较的类型。参数名称:密钥
编辑
我还应该提到,我需要热切地加载最终结果集中的Answers
,例如:
return ctx.Questions.Include(q => q.Answers)
from question in context.Questions
where question.Answers.Any()
let max = question.Answers.Max(a=>a.CreatedOn)
orderby max descending
select question
编辑:因为你想急切地加载答案;您可能希望在SQL Server中执行整个查询,并将其作为存储过程公开给EF,也可能希望在问题表中添加LastAnswerOn列。这将使您的查询更加高效和简单,并且您将能够在EF中毫无问题地使用它。
将没有意义的FirstOrDefault替换为First。或者将整个子查询替换为Max(日期(。它应该起作用。
祝EF好运,它太坏了;-(在许多Linq-To-Sql可以工作的情况下,使用EF,我不得不放弃并获取数据,并在本地进行计算。