【问题标题】:Build SQL Where query from delegate从委托构建 SQL Where 查询
【发布时间】:2012-10-11 19:31:09
【问题描述】:

我正在开发一个用于从数据库中添加、编辑和删除对象的小助手,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

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

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

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

【问题讨论】:

  • @SLaks:那里没有发生太多事情......
  • 看起来您正在创建自己的 ORM。现有的都不适合你吗?
  • 我只是添加实用程序插入更新和删除功能,我正在使用 Acess 数据库。

标签: c# linq expression-trees


【解决方案1】:

你应该直接使用表达式:

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

你可以这样称呼它:

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

这将为您提供完整的表达式树,然后您可以对其进行解密并转换为您的 SQL。编译器将从 lambda 构建表达式树,就像使用 Func&lt;T,bool&gt; 委托一样。

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

【讨论】:

  • 我将如何调用该方法,我需要一个表达式来调用它还是委托工作?
  • @gosukiwi 你的称呼完全一样。 lambda 为您构建表达式树。编辑显示方法调用。
  • 谢谢!我现在可以随心所欲了:) 不过我可能会写一些关于它的东西,它非常简单,我找不到具体的信息
  • @gosukiwi 有关此类事情的大量信息,请参阅Matt Warren's series of articles,包括如何使用(封闭)表达式树中的局部变量。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多