C# C Lambda-其中-相同条件的多个表达式
假设-一个聚会商店希望根据他们的DB中的标准选择人 DB名称生日字段:日、月、年 where需要是动态的,以考虑搜索实例的每个因素: 日=12,月=1,年=1962 日=3,月=4,年=1977;日=13,月=4,年=1977 日=20,月=8,年=1941;日=9,月=1,年=1991;日=19,月=11,年=1986;日=25,月=2,年=1956 以下内容显然不起作用,因为当可能有3个甚至10个搜索实例时,它只考虑一个搜索实例:C# C Lambda-其中-相同条件的多个表达式,c#,lambda,expression,C#,Lambda,Expression,假设-一个聚会商店希望根据他们的DB中的标准选择人 DB名称生日字段:日、月、年 where需要是动态的,以考虑搜索实例的每个因素: 日=12,月=1,年=1962 日=3,月=4,年=1977;日=13,月=4,年=1977 日=20,月=8,年=1941;日=9,月=1,年=1991;日=19,月=11,年=1986;日=25,月=2,年=1956 以下内容显然不起作用,因为当可能有3个甚至10个搜索实例时,它只考虑一个搜索实例: query.Where(o => o.Day == 3
query.Where(o => o.Day == 3 && o.Month == 4 && o.Year == 1997);
我试着研究表达式和参数表达式,但还是无法理解
[注]
@Luaan是目前为止最接近的一个,加上| |将不会解决1。我将发布这篇文章,冒被否决的风险。但是,如果我没有漏掉要点,您可以在where中使用| |或条件:
注意:这并不适用于您列出的所有场景。只需在上附加更多条件,并小心使用括号将它们正确分开。为什么不将日期加载到HashSet中呢
或者我遗漏了什么?如果您需要动态地构建它,使用几个扩展方法就很容易了。例如:
public static Expression<Func<T, bool>> False<T>(this IQueryable<T> @this)
=> _ => false;
public static Expression<Func<T, bool>> Or<T>
(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
=>
Expression.Lambda<Func<T, bool>>
(
Expression.OrElse
(
left,
Expression.Invoke
(
right,
left.Parameters.Cast<Expression>()
)
),
left.Parameters
);
}
你是在找一个简单的| | |还是在这里?或者我没有抓住要点?你可以使用三个列表来存储日、月和年,然后在where条件下使用Contains。如果你认为我的理解是正确的,我会发布一个答案!对不起,你能澄清一下吗that@JayMee-是的,因为它是动态的。不会每次都是一样的。在一次搜索中,它是1,但另一个人搜索的是它的3。每个用户都有不同的search@AnswerIsNot42,这是动态构建Where子句的一种很好的方法。我喜欢这样,它很简洁,并且可以像我建议的那样避免Where的膨胀+1.不是我想要的,而是创意!!!我喜欢它,但老实说,我甚至不想以那种方式对这种逻辑说不。这仍然是一个很酷的概念,我会登录到你的大脑。。。。考虑一下,如果我只需要ID,那么它将是ID、天、月、年…但是还是很好的视角不,那么1不起作用。。。它只是一个实例而不是2。没有或| | |,但无论如何它只能是一个实例?如果o.Day==12,那么o.Day==3是不可能的。第二部分是宾果游戏,这就是我要找的……第一部分我不明白:……这就是我想弄明白的:【编辑-拼写】@AnswerIsNot42什么部分给你带来麻烦?第一个函数只是返回一个类型化的假表达式——基本上,这对于易于键入很重要。secondn函数有点复杂,但归根结底是接受一个表达式,或者使用另一个表达式。棘手的部分是调用lambda,而我通常会将其打开——在可查询项中更容易处理;但这有点干净。有更简单的方法来构建复合表达式,但这是最简单的方法来组合单个表达式或将单个表达式组合在一起explanation@Luaan我有点理解,但我对这一点的想法充其量也就是失去。你说那更干净,好吧,但你能让它更脏/更简单吗?@Luaan page刚刚刷新,我会看看那个链接
HashSet<DateTime> birthDays = new HashSet<DateTime>() {
new DateTime(1962, 1, 12),
new DateTime(1977, 4, 3),
...
};
...
var result = query
.Where(o => birtDays.Contains(o));
public static Expression<Func<T, bool>> False<T>(this IQueryable<T> @this)
=> _ => false;
public static Expression<Func<T, bool>> Or<T>
(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
=>
Expression.Lambda<Func<T, bool>>
(
Expression.OrElse
(
left,
Expression.Invoke
(
right,
left.Parameters.Cast<Expression>()
)
),
left.Parameters
);
}
var predicate = query.False();
foreach (var date in filterDates)
{
predicate =
predicate.Or(i => i.Day == date.Day && i.Month == date.Month && i.Year == date.Year);
}
query = query.Where(predicate);