C# LINQ查询性能问题

C# LINQ查询性能问题,c#,linq,entity-framework,C#,Linq,Entity Framework,我在方法语法中有以下LINQ表达式 IEnumerable<PageElement> elements_test = ObjectContext.PageElements .Where(_dateDebutCheck).Where(_dateFinCheck) .Where(pe => _activeLanguageCheck(pe, language)) .Where(pe => _typeChec

我在方法语法中有以下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;
IEnumerable elements\u test=ObjectContext.PageElements
.Where(_datedebitcheck)。Where(_dateFinCheck)
.Where(pe=>\u活动语言检查(pe,语言))
.其中(pe=>_类型检查(pe,类型元素))
IList list=elements_test.ToList();
private readonly Func\u dateDebutCheck=pe=>pe.datedunch.HasValue&&pe.datedunch.Value!pe.DateFin.HasValue | | pe.DateFin.Value>DateTime.Now;
private readonly Func\u activeLanguageCheck=(pe,l)=>pe.PageElementLanguages.Where(y=>y.Active)。选择(y=>y.LanguageId)。包含(l);
私有只读函数_typeCheck=(pe,t)=>pe.TypeId==t;

我发现,当给ToList打电话花了很长时间,我想知道我是否做错了什么导致性能下降。我现在只运行ToList作为测试,但是只需要几秒钟就可以返回大约7000条记录。如何改进这一点?

这很慢,因为您不再在数据库中进行查询,而是在内存中进行查询。它从
PageElements
表中提取所有数据,然后在内存中对其进行过滤。原因是您使用的是
Func
委托,这迫使LINQ使用
Enumerable
而不是
Queryable
。要修复此问题,请改用
表达式

但我建议不要试图以您目前的方式编写查询。它使查询更难阅读和微调。尤其是当您希望从中产生某种SQL时

也许您可以通过扩展方法来实现:

// needs to be in static class
public static IQueryable<PageElement> TypeCheck(this IQueryable<PageElement> q, byte? typeElement){
    return q.Where(pe=>pe.TypeID == t); // also this might not work is typeElement is null
}

您知道,通过使用
Func
自动使用LINQ To Objects扩展而不是LINQ To SQL吗?EF使用
表达式
,这意味着您正在有效地执行所有客户端过滤…我将运行SQL Profiler,查看生成的SQL是什么,它应该相对简单易读,然后从中获取。如果它没有像Patryk建议的那样在数据库端进行任何过滤,那么它应该很容易测试和修复谢谢!我如何在Where调用中使用表达式?@jimmyjambles我相信按照您编写查询的方式很难做到。把所有的东西放在一起,它应该能正常工作。尝试搜索LINQ并编写。您可能会对如何正确执行该操作有一些想法。在我的代码中,有许多地方我使用了不同谓词的不同组合,在本例中我只使用了4个,但我经常调用更多的谓词,我希望将它们保持在同一个位置,我能够为前2个谓词使用Expression works,但似乎无法为需要的谓词获得正确的语法parameters@jimmyjambles我唯一能推荐的是:@Euphoric,你能看一下这个吗,看看有什么问题吗-
ObjectContext.PageElement.TypeCheck(typeElement).ToList(); // etc..