【问题标题】:how to add to linq query expression if a condition is met dynamically [duplicate]如果动态满足条件,如何添加到 linq 查询表达式 [重复]
【发布时间】:2019-04-16 11:13:45
【问题描述】:

我有一个这样构建的表达式树

Expression<Func<User, bool>> match = o =>
o.Name == viewModel.Name
&& orders.Contains(o.User.Company.CompanyId.ToString())
&& o.dept == viewModel.dept

我只想包含该行

o.dept == viewModel.dept 

当 viewModel.dept 为 1、2 或 3 且表达式树中不包含此条件时,如果它是任何其他值。

此代码在一个函数中,该函数获取 viewModel 作为参数,并且 viewModel 中的值用于查询 EF 模型用户。

目前我有 2 个单独的表达式树来满足这种情况。有没有更好的解决办法?

谢谢

【问题讨论】:

  • 单独的表达式,即单独的Where() 调用是的方法。弄乱表达式树会复杂得多,而且不会真正给您带来好处。
  • (viewModel.dept == 1 || viewModel.dept == 2 || viewModel.dept == 3) &amp;&amp; o.dept == viewModel.dept 不起作用?
  • @taquion,很抱歉它没有用,我仍在使用 2 种不同的表达方式..
  • @poke,你能给我们举个例子吗.. 最后,我需要返回 Expression>.. 干杯 类型的表达式

标签: c# entity-framework linq expression expression-trees


【解决方案1】:

我终于得到了一个优雅的解决方案,使用 LINQKit (https://github.com/scottksmith95/LINQKit) 及其 PredicateBuilder 这就是我所做的。

var match = PredicateBuilder.New<User>(true);
match = match.And(o => o.Name == viewModel.Name);
match = match.And(o =>orders.Contains(o.User.Company.CompanyId.ToString()));
if(viewModel.dept==1 || viewModel.dept == 2 || viewModel.dept==3)
{
    match = match.And(o=>o.dept == viewModel.dept);
}

return match;

【讨论】:

  • 无需使用谓词构建器将前两个条件与前两个条件相加。只需将它们添加到一个表达式中即可。
  • @servy,正确,这是一个简单的条件,但是,如果条件复杂,最好遵循这种方法..
  • 条件的简单或复杂并不重要。真正重要的是你是否动态地组合它们,而你不是。
猜你喜欢
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2013-08-10
  • 2013-12-30
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多