首先,我必须说我在StackOverflow上读了几篇有关此问题的文章,但我无法得到所需的结果。
让我简单解释一下背景:我正在使用Linq-to-SQL查询最近拜访商店的客户,并(可选)仅获取特定支付金额的客户。假设我拥有一个包含客户、拜访和付款类的模型。
因此,关注Where表达式,我正在尝试这样做:
让我简单解释一下背景:我正在使用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;
然而,我不想使用最后的代码,因为我有一些更复杂的场景需要逐步构建筛选表达式,并使用每个部分的“and/or”组合。
附注:我是一个“ADO.Net数据集”人,正在尝试学习Linq-to-SQL和即将推出的Entity Framework,希望很快能对StackOverflow社区有所帮助。
Expression.AndAlso()
方法生成逻辑AND表达式(&&
)。Expression.And()
生成位AND表达式(&
)。 - Jeff Mercado