在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,但结果是相同的。另外如何查看实际的sql查询?在这个特殊情况下,性能是我的主要目标,我可以改进查询吗?我需要更改两个属性:UserQuizes属性和UserQuizes-> VerbalQuizes->问题属性。
将它分成两个查询或者像使用它一样
会更好吗?答案 0 :(得分:11)
对您经常显示的指令进行排序不会对EF或LINQ to SQL产生影响。查询构建器将整个LINQ语句转换为抽象逻辑表示,然后另一个传递将逻辑结构转换为SQL语句。所以WHERE
谓词都将在同一个地方结束。 First()
中的谓词只会被推送到WHERE
子句。 Include
语句也会累积并投射到JOIN
以包含生成包含实体所需的额外列。
所以简短的回答是,无论你构造LINQ语句的顺序如何,EF都会通常生成最符合逻辑的SQL语句。如果您需要进一步调整它,您应该查看存储过程,您可以在其中手工制作SQL。