Код для применения дерева выражений непосредственно к списку - PullRequest
2 голосов
/ 07 апреля 2010

Есть ли в 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);
    }

}

Любая помощь в этом отношении высоко ценится.

1 Ответ

2 голосов
/ 07 апреля 2010

Для всех интересных методов LINQ требуется общее лямбда-выражение - то есть Expression<SomeFuncType>, например Expression<Func<T,bool>> для предикатов (where) или Expression<Func<TSource,TValue>> для проекций (select).

То, что вы делаете звучит как Select, но вам придется придать ему более конкретную лямбду, чтобы это было полезно, и это не сработает легко - вам, вероятно, понадобится немного MakeGenericMethod и т. д.

Повторное применение Expression к LINQ-to-Objects, это легкий бит. Вы можете просто использовать:

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

или

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

(но обратите внимание, что lambda должен быть набран соответствующим образом; Expression не будет обрезать его).

(В качестве альтернативы вы можете вызвать .Compile() для лямбды и использовать обычные LINQ-to-Objects)

...