Linq-to-SQL结合两个表达式<func <t,bool =“”>&gt; (“where clause”)with和/或</func <t,>

时间:2012-02-21 21:37:29

标签: c# linq linq-to-sql

首先,我必须说我已经在StackOverflow上阅读了几篇有关此内容的帖子,但我无法获得所需的结果。

让我解释上下文(简化):我正在使用Linq-to-SQL查询最近访问商店的客户,并(可选)只获得具有一定金额的付款。假设我有一个客户,访问和付款类的模型。

所以,关注Where表达式,我正在尝试这个:

Expression<Func<Entityes.Clients, bool>> filter = null;

filter = c => 
          c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince));


if (minPayment.HasValue && minPayment.Value > 0)
{
     filter.And(
               c => c.Payments.Sum(p => p.Quantity) > minPayment.Value);
}

filter.And方法是一种扩展方法,在本论坛推荐,下面你可以看到定义:

public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,
                                            Expression<Func<T, bool>> expression2)
{
  InvocationExpression invokedExpression =
      Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());

  return Expression.Lambda<Func<T, bool>>
      (Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
}

但是,这对我不起作用,并且结果不会按付款金额进行过滤。数据或linq-to-sql模型没有错误,因为此代码工作正常:

filter = c => 
           c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince)))
             && c => c.Payments.Sum(p => p.Quantity) > minPayment.Value;

但是,我不想使用最后一个代码,因为我有一些更复杂的场景,我需要逐步使用每个部分的'和/或'组合来构建过滤器表达式。

PD:我是一个“ADO.Net DataSets”,他试图学习Linq-to-SQL和很快的实体框架,我希望很快对StackOverflow社区有用。

3 个答案:

答案 0 :(得分:3)

您没有将And的结果分配给任何内容。

我认为代码的相应部分应如下所示:

if (minPayment.HasValue && minPayment.Value > 0)
{
   filter = filter.And(
            c => c.Payments.Sum(p => p.Quantity) > minPayment.Value);
}

问题是你的(或你提到的那样)And函数返回包含两个表达式的连接的表达式。它不会改变它被调用的对象。

答案 1 :(得分:1)

问题在于这一行:

filter.And(c => c.Payments.Sum(p => p.Quantity) > minPayment.Value); 

And方法返回另一个您未分配给任何内容的委托。试试这个:

filter = filter.And(c => c.Payments.Sum(p => p.Quantity) > minPayment.Value); 

为了澄清,And是一种方法,它采用两个表达式并结合它们的逻辑来创建一个新的表达式。它不会更改它执行的表达式,但会返回新表达式作为返回值。因此,在您的代码中,您调用filter.And(...)但没有使用返回值执行任何操作,因此filter仍然引用原始的lambda表达式。

答案 2 :(得分:0)

查看LinqKit及其PredicateBuilder类:http://www.albahari.com/nutshell/predicatebuilder.aspx