2

このクエリを作成すると:

context.Orders.Where(x => context.Customers.Where(c => c.PersonID == 
10002).Select(c => c.CustomerID.Value).Contains(x.CustomerID.Value)).ToList();

次のようなクエリを作成することを期待しています:

select * from Orders where CustomerID in (select CustomerID from Customers 
Where PersonID = 10002)

ただし、生成されたクエリは次と同等です。

select * from Orders o where Exists(select 1 from Customers c where
c.PersonID = 10002 and c.CustomerID = o.CustomerID)

これは非常に単純なクエリで、次のように記述できます。

context.Orders.Where(x => x.Customer.PersonID == 10002).ToList()

しかし、私の実際のシナリオはそうではありません。また、この単純なクエリでは実行時間に違いはありませんが、より複雑なケースでは、予想されるクエリがはるかに高速に実行されます。

どうすれば EF にクエリを希望どおりに使用させることができますか?

4

1 に答える 1

2

私の理論では、EF は をネイティブにサポートしていませんContainsが、サポートしていAnyます。ハックとして、式を同等のAny式に変換し、それExistsが Sql の式に変換されます。

そのアプローチに関する私の問題は、SQLクエリが必要以上に乱雑であることです(あなたの問題)。また、データベースが最適化できない例も見つけました。

Contains私が使用する回避策は、 を innerに置き換えることJoinです。したがって、あなたの例は次のようになります。

from c in context.Customers
join o in context.Orders on o.CustomerId equals c.CustomerId
where c.PersonId = 10002
select o;

(申し訳ありませんが、ラムダ式を使用していることは知っていますが、それらを使用して結合を記述する方法がわかりません)。

于 2014-06-25T18:24:44.863 に答える