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

时间:2011-09-15 04:14:40

标签: c# linq tsql entity-framework-4 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)

2 个答案:

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