Можно ли сделать этот T-SQL Query с LINQ (для сущностей) - PullRequest
3 голосов
/ 15 сентября 2011

Я пытаюсь написать следующий запрос 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-сущности.

Я просто ищу способ написать запрос LINQ-Entities для вышеуказанного требования.

Есть идеи?

EDIT

Вот что я пробовал до сих пор:

var query = questions
              .Where(q => q.Answers.Any())
              .OrderByDescending(
                q => q.Answers.OrderByDescending(
                  a => a.CreatedOn).FirstOrDefault());

Просто надеюсь, я думаю. Получена следующая ошибка:

Выражения DbSortClause должны иметь тип, сопоставимый по порядку. Имя параметра: ключ

EDIT

Я должен также упомянуть, что мне нужно нетерпеливо загрузить Answers в конечном наборе результатов, например:

return ctx.Questions.Include(q => q.Answers)

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011
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.

0 голосов
/ 15 сентября 2011

Замените тот FirstOrDefault, который не имеет смысла, на First.Или замените весь подзапрос на Max (на дату).Это должно сработать.

Удачи с EF, он так сломан ;-) Во многих случаях, когда работает Linq To Sql, с EF мне приходилось сдавать и извлекать данные и выполнять вычисления локально.1003 *

...