实体框架长时间运行查询

时间:2012-03-07 16:20:06

标签: sql-server entity-framework

在我的数据库中有查看“RqstLst” 我从DB创建EF模型。现在我有实体RqstLst。

同一查询有两种变体

public void MyMethod()
{
     context = new WaterMEntities();
     var query = context.RqstLst;
     dgRqstLst.ItemsSource = query;  //dgRqstLst - DataGrid in WPF
}

public void MyMethod()
{
    dgRqstLst.ItemsSource = this.GetRqstLst();
}
private IEnumerable<RqstLst> GetRqstLst()
{
        context = new WaterMEntities();
        string nativeSQLQuery = "SELECT  * " +
                                    "FROM dbo.RqstLst ";
        ObjectResult<RqstLst> requestes =
            context.ExecuteStoreQuery<RqstLst>(nativeSQLQuery);
        return requestes;
}

第一个变体(LINQ to Entities)的执行时间是19秒,第二个,不到1秒。 我在sql server profiler中查看它。我在第一个版本中做错了什么?

2 个答案:

答案 0 :(得分:1)

一个很大的区别是ExecuteStoreQuery没有将返回的对象附加到上下文(至少不是你正在使用的重载),而是你的第一个查询(这会花费时间)。

尝试在第一个查询中定义与第二个查询(= NoTracking)中相同的跟踪行为:

context = new WaterMEntities();
context.RqstLst.MergeOption = MergeOption.NoTracking; // in System.Data.Objects
var query = context.RqstLst;
dgRqstLst.ItemsSource = query; 

答案 1 :(得分:1)

您没有使用第一个选项执行任何操作错误,但根据您的配置,第一个生成的查询可能比您的直接SQL执行复杂得多。您是否使用了分析器来确切了解第一个查询生成的SQL?例如,如果RqstLst恰好是使用TPT继承的抽象基类,则生成的SQL可能很大。