C# 从委托生成SQL查询

C# 从委托生成SQL查询,c#,linq,expression-trees,C#,Linq,Expression Trees,我正在开发一个用于添加、编辑和从数据库中删除对象的小助手,add方法现在正在工作,并且给定一个类型为t的对象,它检查属性、值,并生成一个SQL查询以将数据插入表中(它假定表名是对象的类型,但也可以手动设置) 我现在想做的是一个方法 public bool Update<T>(T obj, Func<T, bool> predicate) 我想生成 WHERE Id = 1 我见过一些类似的问题,我认为这可能是一个很好的起点,但我所看到的只是如何手动创建表达式,而不是如

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

我现在想做的是一个方法

public bool Update<T>(T obj, Func<T, bool> predicate)
我想生成

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

有没有办法从委托生成SQL


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

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

相反,您需要更改方法以获取表达式树。

编译器将允许调用方传递lambda表达式作为参数,该参数将编译为表达式树。

您应该直接使用表达式:

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


一旦你有了表达式树,在你的例子中,你应该能够创建一个表达式来解析树,并将其转换为你的
其中Id=1
结果。

@SLaks:那里发生的事情不多……看起来你在创建你自己的ORM。现有的方法不适合你吗?我只是在添加实用工具插入更新和删除函数,我正在使用一个Access数据库。我将如何调用该方法,我需要一个表达式来调用它,还是委托可以工作?@gosukiwi你用完全相同的方式调用它。lambda为您构建表达式树。已编辑以显示方法调用。谢谢!我现在可以想做什么就做什么:)不过我可能会写一些关于它的东西,这是出人意料的简单,我找不到关于它的信息specifically@gosukiwi有关此类内容的大量信息,请参见,包括如何在表达式树中使用(闭合)局部变量等内容。
public bool Update<T>(T obj, Expression<Func<T, bool>> predicate)
Update(obj, o => o.Id = 1);