我正在尝试编写以下LINQ-Entities查询:
获取已回答的问题列表,按最近回答的顺序排序
所以,问题和答案之间基本上是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-Entities的翻译。
我只是在寻找一种方法来为上述要求编写LINQ-Entities查询。
有什么想法吗?
修改
这是我到目前为止所尝试的内容:
var query = questions
.Where(q => q.Answers.Any())
.OrderByDescending(
q => q.Answers.OrderByDescending(
a => a.CreatedOn).FirstOrDefault());
我猜是有希望的。收到以下错误:
DbSortClause表达式必须具有可比较的类型。 参数名称:key
修改
我还应该提一下,我需要急切加载最终结果集中的Answers
,例如:
return ctx.Questions.Include(q => q.Answers)
答案 0 :(得分:2)
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中使用它。
答案 1 :(得分:0)
用First替换那个没有意义的FirstOrDefault。或者用Max(日期)替换整个子查询。它应该工作。
祝EF好运,它太破碎了;-)在很多情况下Linq To Sql可以工作,使用EF我不得不放弃并获取数据并在本地进行计算。