【发布时间】:2013-11-05 22:33:52
【问题描述】:
我在方法语法中有以下 LINQ 表达式
IEnumerable<PageElement> elements_test = ObjectContext.PageElements
.Where(_dateDebutCheck).Where(_dateFinCheck)
.Where(pe => _activeLanguageCheck(pe, language))
.Where(pe => _typeCheck(pe, typeElement))
IList<PageElement> list = elements_test.ToList();
private readonly Func<PageElement, bool> _dateDebutCheck = pe => pe.DateDebut.HasValue && pe.DateDebut.Value <= DateTime.Now;
private readonly Func<PageElement, bool> _dateFinCheck = pe => !pe.DateFin.HasValue || pe.DateFin.Value > DateTime.Now;
private readonly Func<PageElement, byte, bool> _activeLanguageCheck = (pe, l) => pe.PageElementLanguages.Where(y => y.Active).Select(y => y.LanguageId).Contains(l);
private readonly Func<PageElement, byte?, bool> _typeCheck = (pe, t) => pe.TypeId == t;
我发现当对 ToList 的调用需要相当长的时间时,我想知道是否有什么我做错了导致性能下降。我此时仅运行 ToList 作为测试,但仅返回大约 7000 条记录需要几秒钟。我该如何改进?
【问题讨论】:
-
您知道使用
Func<T, bool>会自动使用LINQ To Objects 扩展而不是LINQ To SQL? EF 使用Expression<Func<T, bool>>,这意味着您正在有效地执行所有过滤客户端... -
我会运行 SQL Profiler 并查看正在生成什么 SQL,它应该相对易于阅读,然后从那里获取。如果它没有像 Patryk 建议的那样在数据库端进行任何过滤,那么它应该很容易测试和修复
标签: c# linq entity-framework