【问题标题】:Translate lambda into sql query将 lambda 转换为 sql 查询
【发布时间】:2022-01-19 13:22:48
【问题描述】:

我想将一个简单的 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 实例置于闭包中。如果您希望创建这样的表达式,则需要将实例作为参数传递。如果您可以就您想要达到的目标具体说明您的问题,我会尝试更具体。
  • 例如在实体框架中有 `` DbSet Persons; ``当我想从这个集合中获取人时,我编写如下代码:``Persons.Single(p => p.ID == personObj.ID)`` 并且实体将其转换为 sql 查询并发送到数据库。在此示例中,实体不需要“personObj”实例来获取实际 ID 来翻译它。我正在尝试自己进行此翻译,但我不知道如何从 personObj.ID 中获取价值来翻译它。感谢您的帮助:)

标签: c# sql linq lambda expression


【解决方案1】:

如果你想直接写下表达式我不认为你可以使用这样的人。这不是“独立的”,而是来自外部。如果您想写下表达式,您需要在表达式中使人员可访问。据我了解,您正在寻找这样的东西:

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);
}

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多