0

我需要构建一个可配置的查询构建器,允许用户组合任意数量的可能条件。例如,假设我们有CustomerOrderOrderItem的经典案例Product。用户希望能够为所有超过 3 个项目的订单绘制报告。或者可能只有一件商品的订单。应该是基本相同的查询,只是比较器会不同。

用户可能还想附加一个条件,即客户居住在区号 10024。或者订单包括至少/大多数/正好 2 件产品 ID 14。显然,每个条件都需要用自己的方法进行硬编码,但每个条件的基本签名将是:

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作为您的返回值。它将自动转换为Expression,Expression并且Func在技术上是可互换的:

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

我已经成功使用了 ScottGu 的Dynamic LINQ Query

在我们的例子中,我们需要在运行时定义我们的 Where 子句,它就像一个魅力。

此处还附有附加信息。

有了这个,您可以执行以下操作:

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