问题描述
我将 EF5 与 MoreLinq 扩展一起使用,在生产中测试我的程序(非常大的数据库)时,我发现该行:
I am using EF5 with the MoreLinq extenstion, while testing my program in production (very big database), I found out that the line:
var x = db.TheBigTable.MaxBy(x => x.RecordTime);
需要很长时间(RecordTime 是一个非索引的datetime)
Takes very long time (RecordTime is a non-indexed datetime)
是不是因为MaxBy 总是在客户端运行(并且首先从数据库中获取所有记录)?
Is that because MaxBy always runs on the client side (and firstly gets ALL records from the database)?
推荐答案
这里是 MaxBy 扩展方法:
Here is the signature of 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
It returns the maximal element (based on the given projection) of an IEnumerable<T>, not an IQueryable<T>. So the results of the query db.TheBigTable are indeed all loaded into memory first, and then they are iterated to find the maximum.