【问题标题】:Code to apply expression tree directly to List将表达式树直接应用于 List 的代码
【发布时间】:2010-04-07 02:24:02
【问题描述】:

在 Linq 中是否有一个方法调用会直接在 List<V> 上应用表达式树?例如,如果我有一个基于 Order 类型的表达式树,并且我有一个 List<Order> 项目集合,我需要在这些项目上应用此表达式。

我正在寻找类似于:

class OrderListStore : IQueryable<V>,
    <other interfaces required to implement custom linq provider>
{
    List<Order> orders;

    public Expression Expression
    {
        get { return Expression.Constant(this); }
    }

    IEnumerator<V> IEnumerable<V>.GetEnumerator()
    {
        //Here I need to have a method that will take the existing expression
        //and directly apply on list
        something like this .. Expression.Translate(orders);
    }

}

我们非常感谢这方面的任何帮助。

【问题讨论】:

  • Select也可以这样使用
  • 非常非常模糊的问题。您能否举一个更具体的例子来说明Expression 可能是什么以及“应用”在这里意味着什么?在您的代码中,您的“表达式”只是一个常量,因此很难看出如何通过某种 Translate 方法将 this 表达式“应用”到 orders

标签: c# .net linq expression-trees


【解决方案1】:

所有有趣的 LINQ 方法都需要通用 lambda 表达式 - 即 Expression&lt;SomeFuncType&gt;,例如用于谓词的 Expression&lt;Func&lt;T,bool&gt;&gt; (where) 或用于投影的 Expression&lt;Func&lt;TSource,TValue&gt;&gt; (select)。

你在做什么听起来Select,但你必须给它一个更具体的 lambda 才能有用,这并不容易 - 你可能会需要一点MakeGenericMethod 等。

Expression 重新应用于 LINQ-to-Objects,这很容易。您可以使用:

var projection = theList.AsQueryable().Select(lambda);

var filtered = theList.AsQueryable().Where(lambda);

(但请再次注意,lambda 必须正确输入;Expression 不会删除)。

(或者,您可以在 lambda 上调用 .Compile() 并使用常规 LINQ-to-Objects)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多