关于c#:IEnumerable vs IQueryable

IEnumerable vs IQueryable

我有一个疑问:

1
topics.OrderBy(x => x.Replies.Any() ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate : x.PostedDate);

它按最后一个回复对主题集合进行排序,或者如果没有回复,则按自己的发布日期对主题集合进行排序。它工作得很好,工作也很好。但是,只有当主题类型为IEnumerable时,它才起作用。如果我试图使其成为"iQuery",我会得到一个错误,说明扩展方法last()未知或具有类似效果。

有人知道为什么吗?由于某种原因,当主题是iQueryable时,在这个查询中获取x.Replies.Last()会引发这个异常。

我希望主题是可查询的,因为我首先从数据库中加载包含所有主题的主题,并按最后的答复排序。然后我对分页主题执行.skip()和.take()。但是,目前它正在将所有主题拖到内存中,然后对内存中的集合执行.skip()和.take()。这是不可接受的,因为添加到论坛的主题越多,加载网站所需的时间就越长,尤其是当数据库与网站不在同一台计算机上运行时。我需要数据库只返回分页行,而不是所有行。我希望在数据库级别进行分页。

有什么想法吗?

ps-我正在使用带有实体框架4.0的linq to实体


你试过topics.OrderBy(x => x.Replies.Any() ? x.Replies.Max(y => y.PostedDate) : x.PostedDate);吗?


IEnumerable:Linq to对象和Linq to XML。

可查询:Linq to SQL


当您尝试运行发布的代码时,数据库的上下文是否仍处于活动状态?如果(或.NET)已释放数据库上下文,则由于连接丢失,您将无法再访问IQueryable对象中的数据。

/维克托


我认为英孚无法正确地翻译你的查询,事实就是这样。因为没有必要每个lamda都能成功地转换成ESQL,所以它有自己的局限性。我认为对于您要查找的内容,它是非常复杂的SQL查询。

我建议您在主题"lastupdate"中创建一个新的日期时间字段,该字段在创建时默认为主题的postdate。第二,当你添加一个新的回复时,你要确保你也更新了主题的最新更新。

通过这样做,您还可以使查询非常简单,并且避免在创建查询时不必要地连接。您不需要查找带有任何联接的答复表的更新日期。

我做这种缓存(在数据库设计术语中称为非规范化),这在设计上并不完美,但通过性能和编码,它更容易和简单。