use*_*731 15 c# linq entity-framework
在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)
Run Code Online (Sandbox Code Playgroud)
请注意,第一个查询使用包括在where之前和之后的where,但结果是相同的.另外如何查看实际的sql查询?在这个特殊情况下,性能是我的主要目标,我可以改进查询吗?我需要更改两个属性:UserQuizes属性和UserQuizes-> VerbalQuizes-> Question属性.
将它分成两个查询或者像它一样使用它会更好吗?
Rex*_*x M 17
对您经常显示的指令进行排序不会对EF或LINQ to SQL产生影响.查询构建器将整个LINQ语句转换为抽象逻辑表示,然后另一个传递将逻辑结构转换为SQL语句.所以WHERE谓词都将在同一个地方结束.内部的谓词First()被推到了WHERE子句中.这些Include语句也会被累积并预测为JOIN包括生成包含实体所需的额外列.
所以简短的回答是,无论您构造LINQ语句的顺序如何,EF 通常都会产生最符合逻辑的SQL语句.如果您需要进一步调整它,您应该查看一个存储过程,您可以在其中手工编写SQL.