将 lambda 转换为 sql 查询
Translate lambda into sql query
我想将一个简单的 LambdaExpression 转换为 sql 查询。我正在尝试通过使用这样的 ExpressionTrees 来做到这一点:
Expression<Func<Person, bool>> exp = (person) => person.ID == 5;
当 where 是表达式中常量右节点时,我可以检索数据并且得到这样的字典:
new Dictionary<string, object>() { { "ID", 5 } };
但是当右节点有属性访问时,我的代码就失败了,因为MemberExpression不能转换成ConstantExpression。例如,我无法从此 lambda 表达式中获取人员 ID 值:
Person person = new Person()
{
ID = 1,
Name = "Test",
Lastname = "Test"
};
Expression<Func<Person, bool>> exp = (p) => p.ID == person.ID;
问题:当右节点有 属性 访问权限时,如何从 LambdaExpression 中检索正文数据。
如果你想直接把表情写下来我觉得你不能这样用person。这不是“独立的”,而是来自外部。如果您想写下表达式,则需要使 person 在表达式中可访问。据我了解,您正在寻找这样的东西:
public static Expression<Func<Person, bool>> GetPredicate(
Person person)
{
var parameter = Expression.Parameter(typeof(Person), "o");
var propertyInfo = typeof(Person).GetProperty(nameof(Person.Name));
var expression = Expression.Equal(
Expression.Constant(propertyInfo.GetValue(person)),
Expression.Property(parameter, propertyInfo));
return Expression.Lambda<Func<Person, bool>>(expression, parameter);
}
我想将一个简单的 LambdaExpression 转换为 sql 查询。我正在尝试通过使用这样的 ExpressionTrees 来做到这一点:
Expression<Func<Person, bool>> exp = (person) => person.ID == 5;
当 where 是表达式中常量右节点时,我可以检索数据并且得到这样的字典:
new Dictionary<string, object>() { { "ID", 5 } };
但是当右节点有属性访问时,我的代码就失败了,因为MemberExpression不能转换成ConstantExpression。例如,我无法从此 lambda 表达式中获取人员 ID 值:
Person person = new Person()
{
ID = 1,
Name = "Test",
Lastname = "Test"
};
Expression<Func<Person, bool>> exp = (p) => p.ID == person.ID;
问题:当右节点有 属性 访问权限时,如何从 LambdaExpression 中检索正文数据。
如果你想直接把表情写下来我觉得你不能这样用person。这不是“独立的”,而是来自外部。如果您想写下表达式,则需要使 person 在表达式中可访问。据我了解,您正在寻找这样的东西:
public static Expression<Func<Person, bool>> GetPredicate(
Person person)
{
var parameter = Expression.Parameter(typeof(Person), "o");
var propertyInfo = typeof(Person).GetProperty(nameof(Person.Name));
var expression = Expression.Equal(
Expression.Constant(propertyInfo.GetValue(person)),
Expression.Property(parameter, propertyInfo));
return Expression.Lambda<Func<Person, bool>>(expression, parameter);
}