【问题标题】:Evaluating an expression stored as a string评估存储为字符串的表达式
【发布时间】:2010-08-24 09:24:22
【问题描述】:

我想在数据库中存储一个布尔表达式,并对其进行评估。不需要存储完整的表达式树,一个字符串就可以了。

我设想了一个这样的方案:Criteria (expression_to_evaluate, value_to_return)

例如,假设我有一个匹配年龄在 20 到 40 岁之间的人的表达式:

(var >= 20 AND var <= 40)

var 必须替换为相关人员的年龄,如果匹配,则应返回该行。如果不匹配,则应考虑下一行,评估该表达式,依此类推。

可以有更复杂的表达式,例如: ((var &gt;= 20 AND var &lt;= 40) OR (var &lt; 10))

甚至可能有两个变量: ((var1 &lt;= 10) AND (var2 &gt;= 10 OR var1 == 20))

这应该在 SQL (SQL Server 2005/2008) 或 C# 中完成。匹配行的值,应返回并在 C# 中进一步处理。

这可能吗?

【问题讨论】:

  • CAUTION: SQL Injection Attach !!,你也应该在存储之前验证你的表达式,因为 Sql 也会执行任何有害的东西而不会给你任何警告。
  • 我已经想到了,所以需要进行某种验证。但是感谢您指出这一点。

标签: c# sql expression expression-trees evaluation


【解决方案1】:

EXECUTE | EXEC 允许您先构建一个 T-SQL 字符串,然后执行它。您可以执行逻辑以首先根据您的变量构建字符串,然后只需 EXEC 它。

同样,您可以在 C# 中执行相同的操作,并使用 ExecuteNonQuery()ExecuteReader() 执行 T-SQL。

【讨论】:

  • 我什至没有想到这一点。这实际上听起来像是一个解决方案,但我想知道如何确定需要多少变量。我必须以某种方式将其从 C#(要传入的参数)映射到要评估的表达式。有什么想法吗?
  • 这会变得相当复杂。有一篇代码项目文章,有人对此进行了探索:codeproject.com/KB/database/Building_Dynamic_SQL.aspx
【解决方案2】:

使用深藏在 Visual Studio 代码示例中的 System.Linq.Dynamic 内容,以及普通的 linq-to-sql。指定的属性名称映射到生成的实体类。

myContext.MyTable.Where("Property > 20 && Property < 40").ToList();

【讨论】:

  • 我从未听说过 Linq.Dynamic,这在这种情况下听起来非常有用。我也许可以使用它。你知道他们是如何被评估的吗?它是由 DBMS 完成的吗? sql注入攻击呢?
  • 这是一个将这些字符串转换为普通表达式树的解析器。它不是特定于数据库的,它会根据查询对象的属性进行评估。 Dynamic Linq 不涉及数据库,它只是创建传递给底层 IQueryable 实现的表达式树,这可能是 linq-to-sql。避免 sql 注入是 IQueryable 实现的责任。
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 2016-04-24
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多