web-dev-qa-db-ja.com

Expression <T、bool>を文字列に変換する

将来のある時点で、動的に生成されたレポートを再作成する方法が必要です。簡単に言うと、特定のlinqクエリ(レポートごとに異なる)をデータベースに保存し、後で動的Linqを使用してクエリを実行する必要があります。

これはすべて良いのですが、式を文字列に変換する方法が見つかりません。

のように:

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

になるはずです:

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

それを行う方法はありますか?

35
user302845

これは最良/最も効率的な方法ではないかもしれませんが、それはします機能します。

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))
44
TheCloudlessSky