【发布时间】: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 会比手动修改表达式更好吗?
-
两个问题的标题都是错误的,也是你问题的根源。您不会将表达式转换为字符串。您正在询问如何将表达式树转换为特定语言 SQL。可以为单个表达式树生成无限种语言。答案是使用既理解表达式树又理解目标语言的访问者,并以目标语言发出您想要的任何内容。
标签: c# linq lambda expression