ここでは、しばらくの間、Reflectorの出力を行った後の私の発見です。 LINQツーオブジェクトはほとんど& &オペレータのように動作し、それを引き起こしてWhereArrayIterator
かWhereListIterator
を使用した場合の連続where
述語を組み合わせることではなく、まったく同じように:
節はこのように見てFunc<TSource, bool>
に変換どこx.a==1 && x.b==1
使用する場合:
bool daspredicate(TSource x)
{
return x.a==1 && x.b==1
}
ただし、連続するWhere句を使用すると、少なくともJITされていない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が関数をインライン化しない限り、これはかなり高価になります。私はそれがうまくやっていると確信していますが、JITの仕事は、必要な場合を除いて、自分たちのWhereステートメントを組み合わせるとずっと簡単になります。
しかしSQL側では、クエリは同じです。実行前でも、デバッガはクエリオブジェクトを同じSQL文に評価します。物事ははるかに複雑に思えたので、私はLinq名前空間であまりにも遠くに行くことはできませんでしたが、クエリは同じなので、上記のLINQからオブジェクトへの例とは違って、ペナルティはありません。
EDIT:SQLサーバー上でネストされたサブクエリをもたらす複数のwhereステートメントを見たことがあります。私は、あなたが安全な側にいることができるときはいつでも、どこに声を掛けて声を出すのが良いかと思います。
ほとんどの複製http://stackoverflow.com/questions/1648730/when-using-linq-what-is-the-difference-between-and-multiple-where-clauses –
私は私の中でそれを見つけられませんでしたとにかくこれはLINQ-to-SQL固有のものです。 –
LINQ-to-Objectsへの影響は明らかですが、LINQ-to-SQLは不明です。 –