包含作为方法参数的C#LINQ lambda表达式
我正在编写一个方法,该方法获取一个lambda表达式作为参数,用于过滤包含作为方法参数的C#LINQ lambda表达式,c#,linq,lambda,contains,func,C#,Linq,Lambda,Contains,Func,我正在编写一个方法,该方法获取一个lambda表达式作为参数,用于过滤IList\u集合 public void DoSomething(SomeModel model) { FilterCollectionUsingPredicate(x => x.Name.Equals(model.Name)); } private void FilterCollectionUsingPredicate(Func<SomeModel, bool> predicate) { _
IList\u集合
public void DoSomething(SomeModel model)
{
FilterCollectionUsingPredicate(x => x.Name.Equals(model.Name));
}
private void FilterCollectionUsingPredicate(Func<SomeModel, bool> predicate)
{
_collection = _collection.Where(predicate).ToList();
}
当然,FilterCollectionUsingPredicate
方法不会看到someOtherCollection
,因此会抛出错误。
有人能解释一下如何正确地定义和使用这个函数来处理这种情况吗?好吧,试着创建一个泛型扩展,表达式应该跟踪表达式中的所有其他数据。尝试将谓词创建为表达式
private void FilterCollectionUsingPredicate(Expression<Func<SomeModel, bool>> predicate)
{
_collection = _collection.Where(predicate).ToList();
}
private void FilterCollectionUsingPredicate(表达式谓词)
{
_collection=_collection.Where(谓词).ToList();
}
它应该可以工作。抛出了什么错误?仅供参考
someOtherCollection
将被捕获为粘贴的lambda的一部分。我认为谓词必须是表达式
而不是乐趣
。您必须添加更多细节,因为我已尝试复制此内容,并且它工作正常。至少我们需要知道错误。@Sajid我对此表示怀疑,因为在分配给\u集合时使用ToList
表示我们没有处理IQueryable
。但是,\u集合
可能是OP首先为其分配IQueryable的IEnumerable
。这只是OP提供更多细节的另一个原因。@juharr:你是对的,问题的解决方案,很好。没有错误。这可能是答案,但问题中没有任何东西暗示它是错误的。Func没有跟踪所有其他外部项,这就是获取错误的原因。表达式保持对中原始项的跟踪或路径expression@Alen.Toma这是完全错误的。捕获类型为Func
的lambda中的所有局部变量。如果提供程序要像EF转换为SQL一样转换代码,则只需要将其转换为表达式。如果这是使用linqto对象,那么lambda将捕获其闭包中使用的任何变量。
private void FilterCollectionUsingPredicate(Expression<Func<SomeModel, bool>> predicate)
{
_collection = _collection.Where(predicate).ToList();
}