c# - 在数据库中存储和解析 bool 表达式

标签 c# sql sql-server tsql

这是我之前问题的后续问题 which design pattern is suitable for this workflow requirement? .我想知道在数据库中存储 bool 表达式然后在运行时毫不费力地对其进行评估的最佳方法是什么。我有一个要求,每个月末需要从屏幕上执行一组作业,并且是否可以执行作业的决定取决于以前作业的结果。所以我应该能够在数据库中保存一个表达式,比如 E = (A or B) and (C or D) (可以是任何复杂的嵌套表达式)。这意味着如果 A 或 B 成功且 C 或 D 成功,则 E 可以运行。这如何在数据库中表示和解析以及稍后评估条件?

想这样做(还没测试)
如果“工作 E =(A 和 B)或(C 和 D)”。以树形结构存储在表中

JobId DependentJobId SuccessJobId FailureJobId
E        A             B             C              
E        C             D             0
E        D             1             0
E        B             1             0

这意味着“如果 A 成功,则检查 B,否则检查 C”,“如果 C 成功,则检查 D”。进程从没有“DependentJobId”的最高节点开始,并在叶节点处停止。我使用虚拟作业 ID“1”表示成功,“0”表示失败。如果叶节点为零,则允许作业运行。不确定如何最好地在 T-sql 中对此进行评估。我可能必须使用递归函数。

使用的技术:ASP.NET 3.5、C#3.0、SQL Server 2008

最佳答案

您可以将表达式作为字符串存储在数据库中,然后在运行时使用一组自定义函数或现有引擎解析它们。为此,我在以前的项目中使用了以下内容:

FLEE (Fast Lightweight Expression Evaluator)

Dynamic Linq

我想说 Dynamic Linq 更容易使用,因为您基本上可以使用熟悉的 Linq/C# 语法构造一个 where 子句,并将其作为字符串存储在数据库中。我在我想构建自己的简单查询语言的项目中使用了 FLEE,但是我现在可能可以通过使用 Dynamic Linq 来实现其中的很多。

关于c# - 在数据库中存储和解析 bool 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4183903/

相关文章:

mysql - 如何处理这个复杂的查询?

mysql - 使用 "IF"时程序无法正常工作

php - #1046 - 未选择数据库

c# - 通用存储库,CreateObjectSet<T>() 方法

c# - 流畅的nhibernate级联删除到已连接子类的集合

MySQL - 选择 JSON 键对值的数据

c# - 与 C# 的 SQL 连接

c# - 如何将类属性的值设置为插入到数据库时另一个类的生成的 id 值?

c# - 如何减少后台工作程序中使用匿名管道的程序的 CPU 使用率?

c# - 在 C# 中解析 JSON