构建SQL来自委托的查询位置

时间:2012-10-11 19:31:09

标签: c# linq expression-trees

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

我现在想做的是一种方法

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

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

(o => o.Id = 1)

我想生成

WHERE Id = 1

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

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

编辑:我终于可以做我想做的事了,我发了一篇关于here的帖子。

2 个答案:

答案 0 :(得分:6)

您应该直接使用表达式:

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

您可以这样称呼:

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

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

一旦有了表达式树,在您的情况下,您应该能够创建一个ExpressionVisitor来解析树,并find all of the Where statements转换为您的WHERE Id = 1结果。

答案 1 :(得分:1)

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

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