C#linq包括before-after之后

时间:2016-02-28 16:25:02

标签: 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)_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->问题属性。

将它分成两个查询或者像使用它一样

会更好吗?

1 个答案:

答案 0 :(得分:11)

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

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