Performance 带有可选where子句的实体框架

Performance 带有可选where子句的实体框架,performance,entity-framework,Performance,Entity Framework,下面是我在EntityFrameworkV4中遇到的一个问题的简化版本,其中第一次加载一个36行的表似乎需要30秒左右 在此之后,在更改搜索参数之前,加载速度非常快,然后再次需要30秒,但一旦搜索参数组合完成,则加载速度非常快 每次使用不同的参数组合时都会重复此操作 IQueryable<User> result= GetAllUsers(); if (!String.IsNullOrWhiteSpace(firstNameSearchParam)) { result =

下面是我在EntityFrameworkV4中遇到的一个问题的简化版本,其中第一次加载一个36行的表似乎需要30秒左右

在此之后,在更改搜索参数之前,加载速度非常快,然后再次需要30秒,但一旦搜索参数组合完成,则加载速度非常快

每次使用不同的参数组合时都会重复此操作

IQueryable<User> result= GetAllUsers();

if (!String.IsNullOrWhiteSpace(firstNameSearchParam))
{
    result = result.Where(u => u.firstname.contains(firstNameSearchParam))
}    

if (!String.IsNullOrWhiteSpace(lastNameSearchParam))
{
    result = result.Where(u => u.lastname.contains(lastNameSearchParam))
}

Var ret = result.ToArray();
IQueryable结果=GetAllUsers();
如果(!String.IsNullOrWhiteSpace(firstNameSearchParam))
{
结果=结果。其中(u=>u.firstname.contains(firstNameSearchParam))
}    
如果(!String.IsNullOrWhiteSpace(lastNameSearchParam))
{
结果=结果。其中(u=>u.lastname.contains(lastNameSearchParam))
}
Var ret=result.ToArray();
任何想法都将不胜感激


我不确定他是否会帮忙。我试过了,但没能让它工作。

从sql端执行查询需要多长时间

你可以在这个链接上使用scott提到的这个想法

我认为这也适用于实体框架,还有一个想法,可以使用实体框架元数据

希望这能对你有所帮助


关于

如果我从探查器中获取sql并执行它,那么它实际上是即时的,因此我很有信心不是查询速度慢,而是ef构建查询并将其映射到dto的方式,查看本文以了解更多信息使您的工作更简单的最佳方法是:使用动态字符串生成器构建where子句,然后您可以使用[DbContext].Database.SqlQuery(YourSql)如果您需要示例,我可以编辑我的答案以向您展示示例。花费的时间在哪里?分析应用程序,或暂停调试器。是的,如果完成了,时间是在ToArray()中,也就是在sql中实际执行可查询项,但sql中的查询只需几分之一秒。我怀疑,因为这是第一次,EF正在构建视图或其他东西,这就是为什么它第二次很快。我不确定是否可以为动态生成的查询获取每个构建视图的EF。时间不是直接花在ToArray上的(不能是因为ToArray对SQL一无所知)。调用堆栈更深入。启用“显示外部代码”并查看实际堆栈。使用EF5或EF6RC为同一查询创建原型可能是值得的。在某些情况下,EF5比EF4快6倍。我已经将查询封装到一个控制台应用程序中,并将EF4.0升级到EF5 nugget包,并将项目改为使用.NET4.5。第一次查询的运行速度仍然很慢,后续调用的运行速度也很快。