C#linq包括before-after之后

在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之前和之后的where,但结果是相同的。 另外如何查看实际的sql查询? 在这个特殊情况下,性能是我的主要目标,我可以改进查询吗? 我需要更改两个属性:UserQuizes属性和UserQuizes-> VerbalQuizes-> Question属性。

将它分成两个查询或者像它一样使用它会更好吗?

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

所以简短的回答是,无论您构造LINQ语句的顺序如何,EF 通常都会生成最合理的SQL语句。 如果需要进一步调整它,您应该查看可以手工编写SQL的存储过程。