繁体   English   中英

LINQ-to-SQL中多个where子句和&&运算符之间有什么区别?

[英]What's the difference between multiple where clauses and && operator in LINQ-to-SQL?

看起来我可以写一个where xa==1 && xb==1的地方

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

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

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

好的,这是我在经过Reflector输出一段时间后的发现。 LINQ-to-Objects在使用WhereArrayIteratorWhereListIterator时将连续的where谓词组合在一起,使得ALMOST的行为类似于&&运算符,但不完全如下:

当你使用xa==1 && xb==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服务器上嵌套子查询的实例。 我认为,只要你能够安全起见,最好坚持使用单一的语句。

LINQ to SQL可以在这里做正确的事情。 我希望它将两个“where”子句转换为单个SQL子句,其中两个部分用“AND”连接在一起。

尝试两者 - 但我非常怀疑你会发现生成的SQL有什么不同。

IMO你应该总是看看生成的SQL是否是非常重要的,但LINQ的工作方式肯定会鼓励你通过用小句子编写来构建一个大型查询 - 所以我真的希望它能够Just Work。

数据库方面它们是相同的。 这只是Linq-to-SQL可组合的副作用(即,您可以从一个查询开始,然后向其添加其他条件,更改投影等)。

代码:

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

要么

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

无论如何,C#的语法糖。 它将编译为LINQ方法链

Where(...).Where(...)

正如你猜测它可能会,所以我真的怀疑生成的SQL有什么不同。 尝试使用像Jetbrains的Resharper这样的工具 - 它甚至提供intellisense,让您可以选择在两者之间自动转换,以节省您重新编写测试的时间。

我的偏好是将非常简单的查询编写为方法链(例如,只涉及1个集合/表并且没有连接)以及更具表现力的Linq糖语法中更复杂的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM