【问题标题】:How to add a condition to existing lambda expression?如何向现有的 lambda 表达式添加条件?
【发布时间】:2015-04-09 12:41:09
【问题描述】:

考虑以下类:

public class Customer
{
    public int Id {get; set;}
    public int GroupId {get; set;}
    public int Number {get; set;}
    public string Name {get; set;}
}

我在服务层中有一个方法:

public Customer Get(Expression<Func<Customer, bool>> where)
{
    return customerRepository.Get(where);
}

调用代码是:

var customer = customerService.Get(x => x.Number == number);

在上述方法中,用户根据属性搜索客户(不包括GroupId,因为它隐藏在 ViewModel 中)。但是,用户总是被分配到一个组,因此,他只能在他的组内搜索客户。所以GroupId必须动态添加。

如何在上述方法中将GroupId 添加到where 表达式中。 GroupId 可能已在表达式中可用,也可能不可用。

【问题讨论】:

标签: c# linq lambda expression


【解决方案1】:

使用PredicateBuilder,您可以帮助构建可以添加到调用中的表达式。这将允许您执行以下操作。

public void DoSearch(MyViewModel vm)
{
    Expression<Func<Customer, bool>> myFilter = x => yourCurrentFilterLogic;
    var combined = myFilter.And(x => x.GroupId == vm.GroupId);   //PredicateBuilder extension method
    var customers = Get(combined);
}

public Customer Get(Expression<Func<Customer, bool>> where)
{
    return customerRepository.Get(where);
}

【讨论】:

  • 为什么需要 PredicateBuilder 而不仅仅是 .Where(x =&gt; x.Id == groupID)?
  • 我做了一个更好的例子,展示了构建单个表达式以发送到他的 Get() 方法,这说明了我为什么想到 PredicateBuilder。他没有提供显示他的第一个表达式的代码,所以不完全清楚是否需要PredicateBuilder
  • @xanatos 尝试了 PredicateBuilder 扩展。我得到了例外:The LINQ expression node type 'Invoke' is not supported in LINQ to Entities
  • 我已经根据这个答案 (stackoverflow.com/questions/22406952/…) 更改了 PredicateBuilder 类,它就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2017-01-22
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多