2

我正在开发一个用于从数据库中添加、编辑和删除对象的小帮手,add 方法现在正在工作,并且给定一个类型为 t 的对象,它会检查属性、值并生成一个 SQL 查询来插入数据到表中(假设表名是对象的类型,但也可以手动设置)

我现在想做的是一个方法

public bool Update<T>(T obj, Func<T, bool> predicate)

所以给定一个 T obj和一个 lambda 函数predicate,如果 predicate 是

(o => o.Id = 1)

我要生成

WHERE Id = 1

我见过一些类似的问题,我认为表达式树可能是一个很好的起点,但我所看到的只是如何手动创建表达式,而不是如何从委托创建表达式。

有没有办法从委托中生成该 SQL?

编辑:我终于可以做我想做的事了,我在这里发了一个小帖子。

4

2 回答 2

6

您应该直接使用表达式:

public bool Update<T>(T obj, Expression<Func<T, bool>> predicate)

你会这样称呼它:

Update(obj, o => o.Id = 1);

这将为您提供完整的表达式树,然后您可以对其进行解密并转换为您的 SQL。编译器将从 lambda 构建表达式树,就像它对Func<T,bool>委托所做的那样。

一旦你有了表达式树,在你的情况下,你应该能够创建一个ExpressionVisitor来解析树,并找到所有的 Where 语句来转换为你的WHERE Id = 1结果。

于 2012-10-11T19:32:38.057 回答
1

从委托创建表达式树是完全不可能的。

相反,您需要更改方法以获取表达式树。
编译器将允许调用者将 lambda 表达式作为参数传递,该参数将编​​译为表达式树。

于 2012-10-11T19:32:18.447 回答