Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向现有lambda表达式添加条件?_C#_Linq_Lambda_Expression - Fatal编程技术网

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
类,它工作得很好!