0

ユーザーが可能な条件をいくつでも合成できるようにする構成可能なクエリビルダーを構築する必要があります。たとえば、、、、およびの古典的なケースがあるとCustomerOrderます。ユーザーは、3つを超えるアイテムがあるすべての注文についてレポートを作成できるようにしたいと考えています。または、アイテムが1つだけの注文かもしれません。コンパレータが異なることを除いて、基本的に同じクエリである必要があります。 OrderItemProduct

ユーザーは、顧客が市外局番10024に住んでいるという条件に取り組むこともできます。または、注文に製品ID 14の少なくとも/ほとんど/正確に2つのアイテムが含まれていることもあります。各条件は、明らかに独自の方法でハードコーディングする必要があります。 、ただし、各条件の基本的な署名は次のようになります。

private static Expression<Func<Order, bool>> SomePredicate(object someParameters)

これまでのところ、これが私が説明した最後の状態に対して私が持っているものです:

private static Expression<Func<Order, bool>> CountProductItems(int productID, int count, Comparator comparator) {
  Expression<Func<Order, int>> productOrderItems = 
    order => order.Items.Where(i => i.ProductID == productID)
                  .Sum(i => i.Quantity);
  switch (comparator) {
    case Comparator.Equals:
      // return... uh... now what?
    case Comparator.GreaterThan:
      // you get the picture....
  }
}

その最後の構文ステップが欠落しているだけです。その式を使用してproductOrderItems、その式が等しい/小さい/大きい/などの場合に順序を返す方法。提供された値count

どうしますか?

4

2 に答える 2

1

Expressionメソッド内のオブジェクトを操作する代わりに、次を使用しFuncます。

Func<Order, int> productOrderItems =
    (Order o) => o.Items.Where(i => i.ProductID == productID)
                        .Sum(i => i.Quantity);

次に、の内部で、戻り値としてswitch上に別のLambda式を作成できます。技術的に交換可能であるため、productOrderItems自動的にに変換されます。ExpressionExpressionFunc

switch (comparator) {
    case Comparator.Equals:
        return (Order o) => productOrderItems(o) == count;
        break;
    // etc.
}
于 2013-01-08T16:53:48.420 に答える
0

私はScottGuによる動的LINQクエリを成功裏に使用しました。

この場合、実行時にWhere句を定義する必要があり、それは魅力のように機能しました。

ここでは、追加情報とともに参照されます。

これを使用すると、次のようなことができます。

var query = Northwind.Products.Where("CategoryID=2 And UnitPrice>3");
于 2013-01-08T16:51:39.340 に答える