2016-02-28 50 views
3

在LINQ是有之间的差异:即第一查询使用包括C#LINQ包括前 - 后其中

EFDbContext _db = new EFDbContext(); 



    1)_db.UserQuizes 
     .Where(uq => uq.UserId == currentUserId && uq.QuizId == quizId) 
     .Include(qz => qz.Quiz.VerbalQuizes.Select(q => q.Question)).First() 

2)_db.UserQuizes 
     .Include(qz => qz.Quiz.VerbalQuizes.Select(q => q.Question))       
     .Where(uq => uq.UserId == currentUserId && uq.QuizId == quizId).First() 

    3)_db.UserQuizes 
      .Include(qz => qz.Quiz.VerbalQuizes.Select(q => q.Question)) 
      First(uq => uq.UserId == currentUserId && uq.QuizId == quizId) 

通知后在那里和第二前哪里,但结果是相同的。另外如何看到实际的SQL查询?在这个特殊情况下,perfomance是我的主要目标,我可以改进查询吗?我需要更改两个属性:UserQuizes属性和UserQuizes-> VerbalQuizes-> Question属性。

它会更好分裂这两个查询或使用像,因为它是指令

+0

此实体框架? –

+0

是的,抱歉让人困惑 – user3857731

+1

使用SqlProfiler查看发送到SQLServer的查询(有点cumersome工具,但它做你需要的),或者使用Glimpse和EF插件来显示给定页面生成的SQL。 – csharpfolk

回答

3

订购,就像你经常所示不会使EF或LINQ to SQL中的差异。查询构建器将您的整个LINQ语句转换为抽象逻辑表示形式,然后另一个传递将逻辑结构转换为SQL语句。所以WHERE谓词都将在同一个地方结束。 First()中的谓词刚刚被推送到WHERE子句。 Include报表也会累积并预测到JOIN,以包含生成包含实体所需的额外列。

所以简短的答案是EF将通常产生最合乎逻辑的SQL语句,无论您构建LINQ语句的顺序如何。如果您需要进一步调整它,您应该查看一个存储过程,您可以在其中手工制作SQL。