C# Linq包含前后where条件

32

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

将其拆分为两个查询或者像现在这样使用,哪种方式更好呢?


这是Entity Framework吗? - BJ Myers
是的,抱歉让您感到困惑。 - user3857731
2
使用SqlProfiler查看发送到SQLServer的查询(这是一个有点繁琐的工具,但它可以满足您的需求),或者使用带有EF插件的Glimpse来显示为给定页面生成的SQL。 - csharpfolk
我尝试了ExpressProfiler,生成的SQL完全相同。 - buga
1个回答

39

像你展示的指令排序通常不会影响 EF 或 LINQ to SQL。查询构建器将您的整个 LINQ 语句转换为抽象逻辑表示,然后另一个遍历将逻辑结构转换为 SQL 语句。因此 WHERE 谓词都会最终处于相同的位置。First() 中的谓词只是被推到了 WHERE 子句中。 Include 语句也会被累计并投射到 JOIN 中以包括生成所包含的实体所需的额外列。

所以简短的答案是,EF 通常无论您如何构造 LINQ 语句,都会产生最合乎逻辑的 SQL 语句。如果需要进一步调整,则应查看存储过程,其中可以手工编写 SQL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接