У меня есть 4-слойный архитектурный проект, то есть UserInterface, BusinessLogic, Service (WCF) и DataAccess (EF6). Я выставил методы моей службы, которые принимают выражение, которое я могу передать на мой уровень данных, который будет оцениваться с использованием EF. Однако это не работает, потому что выражение не сериализуемо.Как работать с Expression Деревья не работают с WCF, так как они не могут быть сериализованы?
На моем конце клиента я хочу иметь возможность создавать запросы для отправки на сервер и возвращать правильную проекцию.
стороне сервера:
public virtual IEnumerable<Person> Get(Expression<Func<Person, bool>> expression)
{
using (var ctx = MyContext())
{
IQueryable<PersonDto> col = ctx.DbContext.People.Where(expression);
//
return col.ToList();
}
}
Клиент сторона:
public IEnumberable<PersonDto> GetFromService(Expression<Func<PersonDto, bool>> expression)
{
using (MyService client = new MyService())
{
return client.Get(expression);
}
}
Есть ли альтернатива, как я делаю это? И есть ли причина, почему выражения и функции не могут быть сериализованы?
Вы можете попробовать использовать эту библиотеку: https://github.com/esskar/Serialize.Linq – Evk
Alreay ответил здесь: https://stackoverflow.com/questions/567316/can-you-pass-funct-bool-through-a-wcf-service –
Есть ли причина для сериализации дерева выражений по строковым критериям? то есть передать строковые критерии серверу, который затем создает дерево выражений. Сериализация деревьев выражений добавляет сложность/накладные расходы, что затрудняет отладку/устранение проблем. –