我正在查找一个示例如何使用Telerik网格框架的特定部分(ASP.NET MVC3,但这不是真的在这里相关)。他们有一段代码,这需要过滤器说明的列表,并建立一个表达式:Linq表达式语法和编译
System.Linq.Expressions.Expression<Func<MyModel, bool> exp =
ExpressionBuilder.Expression<MyModel>(listOfFilters);
好了,我觉得这很好。表达式包装一个lambda,它在MyModel上运行以生成一个布尔值。大。现在,他们的例子只是下降到这一点,像这样一个地方:
someList = someList.Where(exp);
对此我推测应该是“哎应用该表达列表中的所有项目(这当然是通用为MyModel太)然而, VS声称代码不能编译,我得到“没有超载存在或者System.Func有一些无效参数”
我玩弄了它,发现我可以编译表达式,
someList = someList.Where(x => exp.Compile()(x));
哪个编译和会pro可以工作,但这让我感到不舒服,因为我现在明显在我所知道的范围之外工作。
为什么(IDE设置,标志,陈旧文档)示例的方法不起作用有一些原因吗? 对我的黑客和示例有一个粗略的等价关系吗? 我应该以不同的方式构建该hack以避免一些可怕的问题(比如,它不会每次编译表达式时都检查表达式中的项目,对吗?我认为它足够聪明)
- - 编辑 是的,它是IEnumerable。我陷入了“所有Wheres都是平等的”陷阱。 谢谢大家!
有趣。这也有用,所以我可以清理一下我的代码。我想那个问题是为什么我需要这样做呢? – Mikeb 2012-02-27 21:15:12
这是正确的。附注:这有可怕的表现,因为编译表达式非常昂贵。 – usr 2012-02-27 21:15:21
@Mikeb IEnumerable .Where()需要一个Func,而不是一个表达式,对吧?你的Expression.Compile正在生成一个Func - 这可能是它的原因。但是,鉴于Telerik示例中的用法,我会看看Telerik框架是否具有扩展方法。 –
2012-02-27 21:18:58