Преобразование выражения ‹T, bool› в строку

Мне нужен способ воссоздать динамически генерируемые отчеты в какой-то момент в будущем. Короче говоря, мне нужно сохранить определенный запрос linq (разный для каждого отчета) в базе данных, а затем выполнить запрос с помощью динамического Linq позже.

Это все хорошо, но я не могу найти способ преобразовать выражение в строку.

As in:

Expression<Func<Product, bool>> exp = (x) => (x.Id > 5 && x.Warranty != false);

должно стать:

"Product.Id > 5 && Product.Warranty != false"

Есть ли способ сделать это?


person Community    schedule 25.01.2011    source источник
comment
Я думаю, вы спрашиваете Expression<Func<Product,bool>>, я изменил ваш вопрос.   -  person Cheng Chen    schedule 25.01.2011
comment
Это примерно тот же вопрос, что и этот: stackoverflow.com/questions/217961/   -  person kelloti    schedule 25.01.2011
comment
Да, правильно, я оставил функциональную часть.   -  person    schedule 25.01.2011
comment
Возможно, это поможет: code.msdn.microsoft.com/exprserialization   -  person sinelaw    schedule 25.01.2011
comment
Что не так с ToString()?   -  person leppie    schedule 25.01.2011
comment
@leppie: ToString () очевидно возвращает метаданные из отражения, а не фактическое строковое представление лямбда-выражения.   -  person    schedule 25.01.2011
comment
возможный дубликат преобразовать дерево-выражения в исходный код -string   -  person nawfal    schedule 19.12.2013


Ответы (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))
person TheCloudlessSky    schedule 25.01.2011