c# – LINQ-to-SQL中多个where子句和\u0026\u0026运算符之间有什么区别?

看起来我可以写一个x.a == 1&& x.b == 1 as

where x.a==1
where x.b==1

据我所知,后者转变为.Where(x => x.a == 1).Where(x => x.b == 1),但这又如何转化为DB?哪个在优化方面会更好?我总是可以查看来自探查器的已执行查询,但这不是一般化,而是更像是单一的经验观察,我不想依赖它.

使用反射器来访问System.Linq命名空间是另一种选择,但是我们会错过机会来节省许多人在同一件事上花费时间.如果我没有得到任何答案,我会这样做.

最佳答案
好的,这是我在经过Reflector输出一段时间后的调查结果.当使用WhereArrayIterator或WhereListIterator时,LINQ-to-Objects将连续的where谓词组合在一起,使得ALMOST表现得像&&运算符,但不完全是:

当你使用x.a == 1&& x.b == 1 where子句转换为Func< TSource,bool>看起来像这样:

bool daspredicate(TSource x)
{
    return x.a==1 && x.b==1
}

但是,当您使用连续的Where子句时,会有轻微的性能损失,至少从非JITted IL方面.以下是组合后代码的样子:

bool predicate1(TSource x)
{
     return x.a==1;
}
bool predicate2(TSource x)
{
     return x.b==1;
}
bool daspredicate(TSource x)
{
    return predicate1(x) && predicate2(x);
}

如您所见,这涉及额外的函数调用开销.除非JIT内联函数,否则这可能非常昂贵.我确信它做得很好,但我们现在知道如果我们自己组合Where声明,除非必要,否则JIT的工作会变得容易多了.

但在SQL方面,查询是相同的.即使在执行之前,调试器也会将查询对象评估为相同的SQL语句.我无法在Linq命名空间中走得太远,因为事情看起来要复杂得多,但由于查询是相同的,因此不应该像上面的LINQ-to-objects示例那样受到惩罚.

编辑:我见过多个where语句导致SQL服务器上嵌套子查询的实例.我认为,只要你能够安全起见,最好坚持使用单一的语句.

转载注明原文:c# – LINQ-to-SQL中多个where子句和\u0026\u0026运算符之间有什么区别? - 代码日志