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

gos*_*iwi 2 c# linq expression-trees

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

我现在想做的是一种方法

public bool Update<T>(T obj, Func<T, bool> predicate)
Run Code Online (Sandbox Code Playgroud)

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

(o => o.Id = 1)
Run Code Online (Sandbox Code Playgroud)

我想生成

WHERE Id = 1
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:我终于可以做我想做的事了,我在这里发了一篇关于它的帖子.

Ree*_*sey 6

您应该直接使用表达式:

public bool Update<T>(T obj, Expression<Func<T, bool>> predicate)
Run Code Online (Sandbox Code Playgroud)

你会以同样的方式调用它:

Update(obj, o => o.Id = 1);
Run Code Online (Sandbox Code Playgroud)

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

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