【问题标题】:MoreLinq maxBy vs LINQ max + whereMoreLinq maxBy vs LINQ max + where
【发布时间】:2021-08-09 17:31:53
【问题描述】:

我正在使用带有MoreLinq 扩展名的EF5,在生产中测试我的程序(非常大的数据库)时,我发现该行:

var x = db.TheBigTable.MaxBy(x => x.RecordTime);

需要很长时间(RecordTime 是非索引的datetime

那是因为MaxBy 总是在客户端运行(并且首先从数据库中获取所有记录)?

【问题讨论】:

  • MoreLINQ 完全是客户端的;你不能真正将它与 EF 一起使用。

标签: c# entity-framework linq-to-sql morelinq


【解决方案1】:

这是the MaxBy extension method的签名:

public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
    Func<TSource, TKey> selector)
{
    return source.MaxBy(selector, Comparer<TKey>.Default);
}

它返回IEnumerable&lt;T&gt; 的最大元素(基于给定的投影),而不是IQueryable&lt;T&gt;。所以db.TheBigTable的查询结果确实都是先加载到内存中,然后再迭代求最大值。

【讨论】:

  • MaxBy() 确实需要从数据源流式传输所有项目以进行客户端比较,但它不需要在开始迭代之前先将所有项目加载到内存中。它可以逐个流式传输项目,并且对于每个项目,它只需将其与迄今为止找到的最大值进行比较,然后再查看下一个项目。所以它确实有将所有数据从服务器发送到客户端的性能损失(而不是计算服务器上的最大值),但它不需要一次将它们全部保存在内存中。
猜你喜欢
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2011-06-29
相关资源
最近更新 更多