2012-03-07 64 views
1

在我的数据库中有查看“RqstLst” 我从数据库创建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到实体)两种变型19秒,对于第二,小于1秒。 我在sql server profiler中查看它。我在第一个变体中做错了什么?

+1

作为一个完整的侧面问题/观察;将元音从单词中删除并将其用作数据表/视图名称(即RequestList - > RqstLst)的人应该被取出并拍摄;) – 2012-03-07 18:10:44

+1

我已经有了查看请求列表。 RqstLst只是为了测试。所以很抱歉,“拍”也许是另一次,另一个原因..;) – AntonL 2012-03-07 18:17:12

回答

1

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

尝试定义在第一个查询相同的跟踪行为,就像你在第二个查询有(= NoTracking):

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

当然值得做必要的事情,但我无法想象这是18秒延迟的来源。另外他提到使用sql server profiler来查看执行时间,这表明减速并非来自后处理。 – Ocelot20 2012-03-07 18:11:13

+0

@ Ocelot20:我也不相信它会持续18秒。对不起,我没有注意到他在SQL中的执行时间已经不同了。 (他可以显示SQL中的差异。)但是,您的答案是一个很好的猜测! – Slauma 2012-03-07 18:21:59

+0

@Slauma,谢谢。它真的帮助。现在执行时间与第一个和第二个选项相同 – AntonL 2012-03-07 18:36:39

1

你没做什么与第一个选项,但根据在您的配置上,第一个生成的查询可能比您的直接SQL执行复杂得多。您是否使用分析器来查看第一个查询生成的SQL究竟是什么?例如,如果RqstLst碰巧是一个使用TPT继承的抽象基类,则生成的SQL可能会很大。

+0

是的,我用探查器什么realy发生'dgRqstLst.ItemsSource =查询;'然后复制它并在管理工作室中执行。它执行少于1秒 – AntonL 2012-03-07 18:30:04