我正在处理一个小帮手,用于添加,编辑和删除数据库中的对象,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的帖子。
答案 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表达式作为参数,该表达式将编译为表达式树。