Запрос LINQ to Entities генерирует странную ошибку - PullRequest
1 голос
/ 09 января 2011

У меня есть форум, и я собираю список недавно активных тем.Я упорядочиваю темы либо по дате последнего ответа, либо в случае, когда тема не имеет ответов, а затем по дате публикации темы.Следующий запрос отлично работает:

        var topicsQuery = from x in board.Topics
                          let lastActivityDate = x.Replies.Any()
                                 ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate
                                 : x.PostedDate
                          orderby lastActivityDate descending
                          select x;

Этот запрос прекрасно работает.Каждый раз, когда страница загружается, темы упорядочены правильно.Однако теперь у меня есть вызов ajax, который ищет обновленную активность и выполняет похожий запрос:

        topics = (from x in DBContext.Topics
                  let lastActivityDate = (x.Replies.Any()
                         ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate
                         : x.PostedDate)
                  where x.BoardID == boardID
                  where lastActivityDate > lastTopic.PostedDate
                  orderby lastActivityDate
                  select x).ToList<Topic>();

Может кто-нибудь увидеть что-то не так с этим запросом LINQ?Он генерирует следующую ошибку:

LINQ to Entities не распознает метод 'MyProject.Models.Reply Last [Ответить] (System.Collections.Generic.IEnumerable`1 [MyProject.Models.Reply])'и этот метод нельзя перевести в выражение хранилища.

1 Ответ

1 голос
/ 09 января 2011

Причиной сбоя является то, что сущности еще не загружены, и Last () будет вызываться на sql, а не в общем списке.Поэтому сначала вам нужно загрузить их, прежде чем запрашивать Last ().Первый пример мог бы сработать, поскольку на плате уже был загружен общий список.

Попробуйте выполнить следующее:

topics = (from x in DBContext.Topics.AsEnumerable<Topic>()
                  let lastActivityDate = (x.Replies.Any()
                         ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate
                         : x.PostedDate)
                  where x.BoardID == boardID
                  where lastActivityDate > lastTopic.PostedDate
                  orderby lastActivityDate
                  select x).ToList<Topic>();

См.: Поддерживается и не поддерживаетсяМетоды LINQ (LINQ to Entities)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...