Я динамически генерирую деревья выражений для отправки в LINQ Entities. Я предоставляю инфраструктуру и разрешаю разработчикам указывать выходные столбцы в качестве лямбда-выражений.
Например, скажем, у них есть столбец, который они могут указать, что способ извлечь значение из базы данных:
p => p.Aliases.Count()
и другой столбец:
p => p.Names.Where(n => n.StartsWith("hello"))
Проблема здесь в том, что мне нужно объединить оба из них в одно выражение.
Моя первая попытка была:
getter = field.SelectorExpression.Body;
И я получаю сообщение об ошибке The parameter 'p' was not bound in the specified LINQ to Entities query expression
, которое появляется с тех пор, потому что LINQ не может знать, что находится в p.Aliases.Count()
.
Следующее, что я попробовал, было:
getter = Expression.Invoke(field.OrderBySelector, new[] {parameter});
Однако затем я получаю сообщение The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.
, которое также появляется после этого, потому что я не ожидаю, что SQL Server будет знать, как запускать лямбда-выражения.
Прямо сейчас в основном есть это выражение:
item => new MyClass
{
SomeValue = item.Name, // this was generated from some other code
AnotherValue = item.SomeOtherColumn, // there can be lots of these
AliasCount = p.Aliases.Count() // here of course is the problem
}
Очевидно, что я хочу заменить выражение на «p», когда создаю его, выражением для элемента (которое у меня есть и я знаю, как его использовать).
TLDR Существует ли простой способ заменить все экземпляры параметра, использованного в выражении LambdaExpression, на другое выражение?