gpt4 book ai didi

c# - 如何评估 LINQ 表达式树中的独立 bool 表达式

转载 作者:行者123 更新时间:2023-12-04 13:05:04 26 4
gpt4 key购买 nike

我正在使用标准访问者模式遍历 LINQ 表达式树以生成动态 SQL WHERE 子句。

我的问题是,与 C# 不同,您不能在 SQL 中使用独立的 bool 表达式;您必须将其与 1 或 0 进行比较。

鉴于这个假设的 lambda 表达式:

h => h.Enabled || h.Enabled == false

很容易错误地生成此代码:
WHERE Enabled OR Enabled = 0

或此代码:
WHERE (Enabled = 1) OR (Enabled = 1) = 0

两者当然都会产生 SQL 错误。当我深入研究子树以找出可能是什么情况时,我应该应用什么逻辑来解决这个问题,而我的代码开始看起来非常迟钝?

编辑:上面的例子当然是多余的——我只是用它来说明一点。

可以创建此场景的示例:
h => h.Enabled
h => h.Enabled == enabled
h => h.Enabled == true

自然,最后一个例子风格很差,但我的代码被设计为独立于程序员的技能水平而工作,因此不满足冗余场景对我来说是糟糕的形式。

最佳答案

以下情况非常简单:

h => h.Enabled == enabled
h => h.Enabled == true

这些是 BinaryExpression节点,您可以直接将它们转换为:
WHERE (Enabled = @p0)
WHERE (Enabled = 1)

您需要处理的特殊情况是:
h => h.Enabled
h => !h.Enabled

这些在表达式树中以不同的方式表示(作为 MemberExpression )。所以你需要特殊情况 MemberExpression并确定它是否正在访问 bool 属性。如果是,则将其转换为规范形式(在第二个示例中检测 UnaryExpression):
WHERE (Enabled = 1)
WHERE (Enabled = 0)

或者,您可能能够预处理表达式树并将任何特殊情况转换为它们的规范(表达式树)形式。例如,任何 MemberExpression符合条件的节点可以转换为正确的 BinaryExpression .

关于c# - 如何评估 LINQ 表达式树中的独立 bool 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1424052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com