繁体   English   中英

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

[英]Is It Possible to do this T-SQL Query with LINQ (to Entities)

我正在尝试编写以下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)
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中使用它而不会出现问题。

用First替换那个没有意义的FirstOrDefault。 或者用Max(日期)替换整个子查询。 它应该工作。

好运与EF,它是如此破碎;-)在许多情况下,Linq To Sql将工作,使用EF我不得不放弃并获取数据并在本地进行计算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM