Как добавить SelectMany в дерево выражений с помощью Expression.Call - PullRequest
1 голос
/ 09 января 2012

Как мне добиться того же результата, что и:

var q = db.TableA.AsQueryable();
var q1 = Queryable.SelectMany(q, a => a.TableB, (a, t) => new { a = a, t = t });
var q2 = Queryable.SelectMany(q1, a=> a.a.TableC, (a, t) = new { a = a, t = t });

путем создания дерева выражений с помощью Expression.Call:

MethodCallExpression returnCallExpression = Expression.Call(
     typeof(Queryable),
     "SelectMany",
     new Type[] ??????,
     query.Expression,
     a => a.TableB,
     (a, t) => new { a = a, t = t });

Я исследую другие перегрузки Expression.Call, чтобы узнать, можно ли это сделать без объявления типа.

Моя проблема в том, что число SelectManys определяется во время выполнения, поэтому я не могу просто их связать. И каждый SelectMany изменяет анонимный тип IQueryable, поэтому у меня возникают проблемы с обходом, не зная тип во время компиляции.

Будем весьма благодарны за любые идеи о том, как применить n номеров SelectMany к IQueryable.

1 Ответ

1 голос
/ 14 марта 2012

У вас действительно есть лямбда-выражения "доступны", такие как a => a.TableB, или они тоже динамические?

Возможно, вы могли бы использовать что-то подобное (возможно, на основе этого сообщения SO )):

public Type[] GetSelectManysAnonymousTypes<TSource, TCollection, TResult>(
        IQueryable<TSource> queryable,
        Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector,
        Expression<Func<TSource, TCollection, TResult>> resultSelector)
{
    return new [] {
        typeof(Expression<Func<TSource, IEnumerable<TCollection>>>),
        typeof(Expression<Func<TSource, TCollection, TResult>>) };
}

Или что-то более сложное может вернуть вам Type[] вместе с массивом выражений Expression[], то есть готовый к вызову Expression.Call ().

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что, забывая анонимные типы, вы не знаете, как выглядит лямбда-параметр collectionSelector, если у вас действительно есть динамическое, неизвестное число цепочек SelectMany (), соединенных вместе.Или я что-то упускаю ...

...