我正在使用 C# 4.5.2。我必须调用SumDenominator
方法作为 Expression.Divide
的分母方法:
var SumDenominatorExpression = Expression.Call(
null,
SumDenominatorMethod,
Parameter,
SumDenominatorSelector
);
然后是实际的Expression.Divide
阅读:
var FractionExpression = Expression.Divide(
SumNumeratorExpression,
SumDenominatorExpression
);
如果分母的选择器生成零,则抛出被零除异常。我试图通过转换 Sum
来解决这个问题表达成 Nullable<>
但 Divide 方法不会吞下空值。而 SQLServer(我的提供者)没有 NULLIF
函数(即 System.Data.Entity.SqlServer.SqlFunctions),我可以将 Call 表达式包裹起来。
人们如何使用 C# 表达式树处理分母中的零?
更新 以下是我最终使用的表达方法:
Expression.Condition(
Expression.Equal(
SumDenominatorExpression,
Expression.Constant(0.0, typeof(double))
),
Expression.Constant(0.0, typeof(double)),
FractionExpression
)
最佳答案
听起来您希望 EF 能够翻译此表达式。这限制了我们可以使用的模式种类。以下应该有效:
FractionExpression =
(SumDenominatorExpression == 0)
? (int?)null /*default value - pick what you want*/
: (SumNumeratorExpression / SumDenominatorExpression);
(为了打字速度,我正在用 C# 编写表达式树。)
由于 EF 不支持具有变量的树,因此您需要使用 SumDenominatorExpression
表达式两次。希望 SQL Server 会优化它并只对其进行一次评估。
关于c# - NULLIF 的表达式方法(带 Divide),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34384449/