Преобразование выражения<T, bool> в строку
Мне нужен способ воссоздать динамически генерируемые отчеты в какой-то момент в будущем. Короче говоря, мне нужно сохранить конкретный запрос linq (различный для каждого отчета) в базе данных, а затем выполнить запрос с динамическим Linq позже.
Это все хорошо, но я не могу найти способ преобразовать выражение в строку.
Как в:
Expression<Func<Product, bool>> exp = (x) => (x.Id > 5 && x.Warranty != false);
должен стать:
"Product.Id > 5 && Product.Warranty != false"
Есть способ сделать это?
1 ответ
Решение
Это может быть не самый лучший / самый эффективный метод, но он работает.
Expression<Func<Product, bool>> exp = (x) => (x.Id > 5 && x.Warranty != false);
string expBody = ((LambdaExpression)exp).Body.ToString();
// Gives: ((x.Id > 5) AndAlso (x.Warranty != False))
var paramName = exp.Parameters[0].Name;
var paramTypeName = exp.Parameters[0].Type.Name;
// You could easily add "OrElse" and others...
expBody = expBody.Replace(paramName + ".", paramTypeName + ".")
.Replace("AndAlso", "&&");
Console.WriteLine(expBody);
// Output: ((Product.Id > 5) && (Product.Warranty != False))