2013-11-25 33 views
2

所以我有一个类似的方法:你可以传入一个Expression <Func <T, bool>>谓词到一个linq Where语句中吗?

public List<T> SomeFunction(Expression<Func<T, bool>> predicate) { 
    return someList.Where(predicate).ToList(); 
} 

此代码是不是可编译,因为我不能在谓词传递到LINQ Where语句。有没有办法改变谓词,以便与linq一起使用?

+0

我认为你需要方法的签名更改为'公共列表 SomeFunction (表达>谓语)' – Muctadir

+0

你可以通过'表达> predicate'到LINQ'where' for'IQueryable' – Grundy

回答

4

如果使用Enumerable.Where方法,那么你需要编译你的表达

public List<T> SomeFunction(Expression<Func<T, bool>> predicate) { 
    return someList.Where(predicate.Compile()).ToList(); 
} 

也想想你是否真的需要在这里使用的表达。你可以简单地传递Func<T, bool>

+1

最好注意,在调用频繁的情况下,predicate.Compile()将会带来性能。我认为,OP不理解'Expression '和'SomDelegate'之间的区别。 – Dennis

+0

@Dennis就我所知,Expression的设计主要是为了提供一些方法将表达式从客户端传送到服务器,然后评估表达式并返回结果。在这种情况下,'Compile()'只返回一个普通的委托,所以它比一个普通的'Func <...>'更好吗?我知道'编译'这个词可能会让很多人感到困惑,我们知道每个**编译的东西**会更快,但是在这种情况下,'Compile()'只是一种将表达式转换为可执行形式(委托) 。 –

+0

@KingKing:表达式是将代码表示为树的方式。这是他们的目的。在n层解决方案中将表达式从客户端传输到服务器只是一个应用程序示例(而不是主要的)。你的评论的另一部分应该写给OP,因为我不明白,你想向我解释什么?我知道,Expression.Compile'做了什么,我正在试图警告OP,它会导致性能下降。 – Dennis

相关问题