C# 如何向现有lambda表达式添加条件?
考虑以下类别:C# 如何向现有lambda表达式添加条件?,c#,linq,lambda,expression,C#,Linq,Lambda,Expression,考虑以下类别: 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>> w
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);
}
在上述方法中,用户基于属性搜索客户(不包括GroupId
,因为它隐藏在ViewModel中)。但是,用户始终被分配到一个组,因此,他只能在其组中搜索客户。因此,必须动态添加GroupId
如何将GroupId
添加到上述方法中的where
表达式中。GroupId
在表达式中可能已经可用,也可能尚未可用。使用您可以帮助构建表达式,以便添加到您的调用中。这将允许您执行以下操作
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);
}
publicsvoiddosearch(MyViewModelVM)
{
表达式myFilter=x=>yourCurrentFilterLogic;
var combined=myFilter.And(x=>x.GroupId==vm.GroupId);//谓词生成器扩展方法
var客户=获取(合并);
}
公共客户获取(表达式where)
{
返回customerRepository.Get(在何处);
}
使用您可以帮助构建表达式,以便添加到通话中。这将允许您执行以下操作
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);
}
publicsvoiddosearch(MyViewModelVM)
{
表达式myFilter=x=>yourCurrentFilterLogic;
var combined=myFilter.And(x=>x.GroupId==vm.GroupId);//谓词生成器扩展方法
var客户=获取(合并);
}
公共客户获取(表达式where)
{
返回customerRepository.Get(在何处);
}
研究为什么需要PredicateBuilder而不仅仅是一个。Where(x=>x.Id==groupID)?
我做了一个更好的例子,展示了如何构建一个表达式以发送给他的Get()
方法,这说明了我为什么想到PredicateBuilder
。他没有提供显示其第一个表达式的代码,因此不完全清楚是否需要PredicateBuilder
。@xanatos尝试了PredicateBuilder扩展。我得到了一个异常:LINQ to Entities中不支持LINQ表达式节点类型“Invoke”
我已经根据这个答案()更改了PredicateBuilder
类,它工作得很好!为什么您需要PredicateBuilder,而不仅仅是一个.Where(x=>x.Id==groupID)?
我做了一个更好的例子,展示了如何构建一个表达式发送到他的Get()
方法,这说明了我为什么想到PredicateBuilder
。他没有提供显示其第一个表达式的代码,因此不完全清楚是否需要PredicateBuilder
。@xanatos尝试了PredicateBuilder扩展。我得到了一个异常:LINQ to Entities中不支持LINQ表达式节点类型“Invoke”
我已经根据这个答案()更改了PredicateBuilder
类,它工作得很好!