![](/img/trans.png)
[英]IQueryable vs IEnumerable: is IQueryable always better and faster?
[英]IEnumerable vs IQueryable
我有一个查询:
topics.OrderBy(x => x.Replies.Any() ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate : x.PostedDate);
它按上次答复对主题集合进行排序,如果没有答复,则按其自己的发布日期排序。 它运作良好,并且表现出色。 但是,仅当主题的类型为IEnumerable<Topic>
,此方法才有效。 如果我尝试将其设置为“ IQueryable”,则会收到一条错误消息,提示扩展方法Last()未知或具有某种意义。
有人知道为什么吗? 出于某种原因,当主题为IQueryable时,在此查询中获取x.Replies.Last()
会引发此异常。
我希望主题是IQueryable,因为我首先从数据库中加载主题,其中包含所有主题,并按上次答复排序。 然后,我对分页主题执行.Skip()和.Take()。 但是,当前它将所有主题都拉到内存中,然后对内存中的集合执行.Skip()和.Take()。 这是不可接受的,因为添加到论坛的主题越多,加载网站所需的时间就越长,尤其是当数据库未与网站在同一台计算机上运行时。 我需要数据库仅返回分页的行,而不是所有行。 我希望分页发生在数据库级别。
有任何想法吗?
PS-我正在使用LINQ to Entity Framework 4.0的实体
您是否尝试过topics.OrderBy(x => x.Replies.Any() ? x.Replies.Max(y => y.PostedDate) : x.PostedDate);
?
IEnumerable:LINQ到对象和LINQ到XML。
IQueryable:LINQ to SQL
尝试运行发布的代码时,数据库上下文是否仍处于活动状态? 如果您(或.NET)已经处置了数据库上下文,则由于连接丢失,您将不再能够访问IQueryable对象中的数据。
/维克多
我认为EF无法正确翻译您的查询,它发生了。 因为不必每个lamda都可以成功将其转换为esql,所以它有其自身的局限性。 我认为这是您要查找的非常复杂的SQL查询。
我建议您可以在名为“ LastUpdate”的主题中创建一个新的DateTime字段,该字段在创建时将默认为Topic的PostDate。 其次,当您添加新回复时,请确保同时更新Topic的LastUpdate。
这样,您还可以使查询非常简单,并且避免在创建查询时加入不必要的查询。 您无需使用任何连接来查找PostDate of replies表。
我进行这种缓存(在数据库设计术语中称为非规范化),这在设计方面不是完美的,但从性能和编码方面来说,这非常容易和简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.