Я пытаюсь создать дерево выражений, которое похоже на выполнение подзапросов, таких как:
SELECT (SELECT Sum(Foo) FROM Bar1) - (SELECT Sum(Foo) FROM Bar2))
Я пытаюсь повторно использовать 2 дерева выражений, которые слишком сложны для повторения.
Сейчас у меня есть 2 (упрощенных) дерева выражений:
Expression<Func<Bar, int>> SumBar1 =
(bar) => (from b in bar.Something
where b.Type = 1
select b).Sum();
Expression<Func<Bar, int>> SumBar2 =
(bar) => (from b in bar.Something
where b.Type = 2
select b).Sum();
Я уже пытался использовать Expression.Subtract
:
Expression foo = Expression.Subtract(SumBar1, SumBar2);
Это происходит с ошибкой:
Бинарный оператор Subtract не является
определены для типов
'System.Func 2[Bar,System.Int32]' and
'System.Func
2 [Бар, System.Int32]'.
Я также пытался использовать Expression.Invoke
для вызова деревьев:
Expression.Subtract (
Expression.Invoke (SumBar1, Expression.Parameter (typeof (Bar)),
Expression.Invoke (SumBar2, Expression.Constant (typeof (Bar))));
Но тогда я получаю:
Тип узла выражения LINQ 'Invoke'
не поддерживается в LINQ to Entities.
Есть ли способ объединить два дерева выражений в новое дерево, вычитая их и передавая параметр?