在我的数据库中有查看“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中查看它。我在第一个版本中做错了什么?
答案 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可能很大。