IEnumerable vs IQueryable
我有一个疑问:
1 | topics.OrderBy(x => x.Replies.Any() ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate : x.PostedDate); |
它按最后一个回复对主题集合进行排序,或者如果没有回复,则按自己的发布日期对主题集合进行排序。它工作得很好,工作也很好。但是,只有当主题类型为
有人知道为什么吗?由于某种原因,当主题是iQueryable时,在这个查询中获取
我希望主题是可查询的,因为我首先从数据库中加载包含所有主题的主题,并按最后的答复排序。然后我对分页主题执行.skip()和.take()。但是,目前它正在将所有主题拖到内存中,然后对内存中的集合执行.skip()和.take()。这是不可接受的,因为添加到论坛的主题越多,加载网站所需的时间就越长,尤其是当数据库与网站不在同一台计算机上运行时。我需要数据库只返回分页行,而不是所有行。我希望在数据库级别进行分页。
有什么想法吗?
ps-我正在使用带有实体框架4.0的linq to实体
你试过
IEnumerable:Linq to对象和Linq to XML。
可查询:Linq to SQL
当您尝试运行发布的代码时,数据库的上下文是否仍处于活动状态?如果(或.NET)已释放数据库上下文,则由于连接丢失,您将无法再访问IQueryable对象中的数据。
/维克托
我认为英孚无法正确地翻译你的查询,事实就是这样。因为没有必要每个lamda都能成功地转换成ESQL,所以它有自己的局限性。我认为对于您要查找的内容,它是非常复杂的SQL查询。
我建议您在主题"lastupdate"中创建一个新的日期时间字段,该字段在创建时默认为主题的postdate。第二,当你添加一个新的回复时,你要确保你也更新了主题的最新更新。
通过这样做,您还可以使查询非常简单,并且避免在创建查询时不必要地连接。您不需要查找带有任何联接的答复表的更新日期。
我做这种缓存(在数据库设计术语中称为非规范化),这在设计上并不完美,但通过性能和编码,它更容易和简单。