Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#LINQ lambda表达式_C#_Linq_Lambda_Contains_Func - Fatal编程技术网

包含作为方法参数的C#LINQ 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) { _

我正在编写一个方法,该方法获取一个lambda表达式作为参数,用于过滤
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();
}