是否可以使用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)

是否可以使用LINQ(到实体)执行此T-SQL查询

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,我不得不放弃并获取数据,并在本地进行计算。