2011-01-09 3 views
1

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

 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.IEnumerable1) [MyProject.Models.Reply]) и этот метод не может быть переведен в выражение хранилища.

ответ

1

Причина, по которой это не удается, состоит в том, что сущности еще не загружены, а 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>(); 

См: Supported and Unsupported LINQ Methods (LINQ to Entities)

+0

Я не вижу никакой разницы с версией OP, в вы могли бы выделить разницу? –

+0

@Jani: Обновлен ответ с большим контекстом. –

+0

@Mahesh, который может повредить чувака, вы загрузили все темы в памяти, это очень дорогое решение для СУБД, а также Application Server, что не могло быть хорошей идеей –

Смежные вопросы