C#linq包括在何处之前和之后

C#linq包括在何处之前和之后,c#,entity-framework,linq,C#,Entity Framework,Linq,在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)_

在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)
请注意,第一个查询在where之后使用include,第二个在where之前使用include,但结果是相同的。还有,如何查看实际的sql查询?在这种情况下,性能是我的主要目标,我可以改进查询吗?我需要更改两个属性:UserQuizes属性和UserQuizes->orallquizes->Question属性


最好将它拆分为两个查询,或者按原样使用它。

像您经常展示的那样对指令进行排序不会对EF或LINQ-to-SQL产生影响。查询生成器将整个LINQ语句转换为抽象逻辑表示,然后另一个过程将逻辑结构转换为SQL语句。因此,
WHERE
谓词都将在同一个地方结束。
First()
中的谓词被推到
WHERE
子句。
Include
语句也会累积并投影到
JOIN
s,以包含生成包含的实体所需的额外列


因此,简单的回答是,无论构造LINQ语句的顺序如何,EF通常都会生成最符合逻辑的SQL语句。如果您需要进一步优化,您应该查看一个存储过程,您可以在其中手工制作SQL。

这是实体框架吗?是的,很抱歉使用SqlProfiler查看发送到SQLServer的查询(一个有点cumersome的工具,但它可以满足您的需要),或者使用带EF插件的Skiew显示为给定页面生成的SQL。