3

シナリオ例:
2 つのテーブル: orderorderItem、1 対多のリレーションシップ。
価格が 100 の orderItem が少なくとも 1 つ、価格が 200 の orderItem が少なくとも 1 つあるすべての注文を選択したいと考えています。次のように実行できます。

var orders = (from o in kontextdbs.orders
              join oi in kontextdbs.order_item on o.id equals oi.order_id
              join oi2 in kontextdbs.order_item on o.id equals oi2.order_id
              where oi.price == 100 && oi2.price  == 200
              select o).Distinct();      

しかし、これらの条件がユーザーによって生成された場合はどうなるでしょうか? そのため、条件がいくつあるのかわかりません。

4

2 に答える 2

1

Where次のようなandAnyメソッドを使用して、すべての値をループする必要があります。

List<int> values= new List() { 100, 200 };

var orders = from o in kontextdbs.orders
             select o;
foreach(int value in values)
{    
      int tmpValue = value;
      orders = orders.Where(x => kontextdbs.order_item.Where(oi => x.id == oi.order_id)
                                                      .Any(oi => oi.price == tmpValue));    
}

orders = orders.Distinct();
于 2012-04-20T16:47:06.370 に答える
0
List<int> orderValues = new List() { 100, 200 };

ObjectQuery<Order> orders = kontextdbs.Orders;
foreach(int value in orderValues) {
    orders = (ObjectQuery<Order>)(from o in orders
                                  join oi in kontextdbs.order_item
                                    on o.id equals oi.order_id
                                  where oi.price == value
                                  select o);
}
orders = orders.Distinct();

または、少なくともそれが一般的なパターンです。各段階で IObjectQueryables に追加のクエリを適用できます。

私の経験では、EF を使用してこのような動的クエリを生成すると、残念ながらひどいパフォーマンスが得られることに注意してください。特定のパターンを初めて取得するときに、各クエリを SQL にコンパイルするのに数秒かかります。ただし、注文値の数がかなり安定している場合、この特定のクエリは問題なく動作するはずです。

于 2012-04-20T16:42:32.133 に答える