我有一个论坛,我正在提取最近活跃主题的列表。我是在上次回复日期之前订购主题,或者在主题没有回复的情况下订购主题,然后是主题的发布日期。以下查询正常工作:
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])'方法,并且此方法无法转换为商店表达。
答案 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)