繁体   English   中英

IEnumerable vs IQueryable

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM