gpt4 book ai didi

c# - Linq-to-SQL 结合两个 Expression> ("where clause") 与 and/or

转载 作者:太空狗 更新时间:2023-10-29 23:25:28 28 4
gpt4 key购买 nike

首先,我必须说我已经在 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 和 Entity Framework,我希望很快对 StackOverflow 社区有所帮助。

最佳答案

您没有将 Anding 的结果分配给任何东西。

我想您的代码的相应部分应该如下所示:

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

问题是您的(或您提到的 SO)And 函数返回包含两个表达式的结合的表达式。它不会改变调用它的对象。

关于c# - Linq-to-SQL 结合两个 Expression<Func<T, bool>> ("where clause") 与 and/or,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385550/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com