【发布时间】: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