提问者:小点点

将lambda转换为sql查询


我想将一个简单的LambdaExpression转换为sql查询。我正试图通过使用ExpressionTrees这样做:

Expression<Func<Person, bool>> exp = (person) => person.ID == 5;

当表达式中的where是常量右节点时,我可以检索数据,得到如下字典:

new Dictionary<string, object>() { { "ID", 5 } };

但是当在正确的节点中有一个属性访问时,我的代码会失败,因为Member表达式不能转换为ConstantExpress。例如,我不能从这个lambda表达式中获取人员ID值:

Person person = new Person()
{
    ID = 1,
    Name = "Test",
    Lastname = "Test"
};

Expression<Func<Person, bool>> exp = (p) => p.ID == person.ID;

问题:当右节点中有属性访问权限时,如何从LambdaExpression检索主体数据。


共1个答案

匿名用户

如果你想直接写下这个表达,我认为你不能用这样的人。这不是“独立的”,而是来自外部。如果您希望写下表达式,则需要使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);
}