C#linq包括before-after之后

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.