LINQ to Entities查询生成奇怪的错误

时间:2011-01-09 06:19:19

标签: c# linq entity-framework 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 [Reply](System.Collections.Generic.IEnumerable`1 [MyProject.Models.Reply])'方法,并且此方法无法转换为商店表达。

1 个答案:

答案 0 :(得分:1)

它失败的原因是因为实体尚未加载而且将在sql上调用Last()而不是通用列表。因此,首先需要在请求Last()之前加载它们。第一个例子可能有效,因为 board 已经加载了通用列表。

尝试以下方法:

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)