从 Expression<Func<T, bool>> 转换为字符串

Posted

技术标签:

【中文标题】从 Expression<Func<T, bool>> 转换为字符串【英文标题】:Conversion from Expression<Func<T, bool>> to string 【发布时间】:2021-12-07 08:37:54 【问题描述】:

我需要将 Expression> 转换为字符串。我该怎么做? 这是我要转换的谓词:

var prezziList = ExecQuery<Listino>(i => i.CodArt == articolo.CodArt);

我正在使用这里建议的方法:Converting Expression<T, bool> to String,这是我的方法:

public List<TEntity> ExecQuery<TEntity>(Expression<Func<T, bool>> predicate)

    string expBody = predicate.Body.ToString();

    var paramName = predicate.Parameters[0].Name;
    var paramTypeName = predicate.Parameters[0].Type.Name;
    expBody = expBody.Replace(paramName + ".", paramTypeName + ".")
                 .Replace("AndAlso", "&&")
                 .Replace("==", "=");

    SQLiteCommand sQLiteCommand = new(App.CNManager.Connection);
    sQLiteCommand.CommandText = $"SELECT * FROM myTable WHERE expBody";

    return sQLiteCommand.ExecuteQuery<TEntity>();

但它返回以下字符串,显然格式不正确:

“Listino.CodArt = value(Vendo.ViewModels.DettaglioArticoliViewModel+c__DisplayClass184_0).articolo.CodArt”

我哪里做错了?

【问题讨论】:

使用实体框架或 Dappr 或其他 ORM 会比手动修改表达式更好吗? 你在找ExpressionVisitor 两个问题的标题都是错误的,也是你问题的根源。您不会将表达式转换为字符串。您正在询问如何将表达式树转换为特定语言 SQL。可以为单个表达式树生成无限种语言。答案是使用既理解表达式树又理解目标语言的访问者,并以目标语言发出您想要的任何内容。 【参考方案1】:

您的示例与该问题之间的区别在于,您的条件是变量 articolo.CodArt,该答案中的条件是 const 值。

因此您需要使用一些度量来获取该值,只需替换为获取变量的 stringfy 值。

您需要传递需要获取值的对象,在您的情况下是articolo,然后调用predicate.Compile().Invoke(articolo) 获取值,然后将其转换为SQL。

【讨论】:

以上是关于从 Expression<Func<T, bool>> 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 .net Func<T> 转换为 .net Expression<Func<T>>

Expression<Func<T,TResult>>和Func<T,TResult>

Func<T> 如何隐式转换为 Expression<Func<T>>?

Expression<Func<T,TResult>>和Func<T,TResult> 与AOP与WCF

Expression<Func<T,bool>> 声明是啥意思?

从 c# 表达式中删除不需要的装箱转换