我使用的是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),可以将调用表达式包装起来。
人们如何用C#表达式树来处理分母中的零?
UPDATE这里是我最后使用的表达式方法:
Expression.Condition(
Expression.Equal(
SumDenominatorExpression,
Expression.Constant(0.0, typeof(double))
),
Expression.Constant(0.0, typeof(double)),
FractionExpression
)
发布于 2015-12-20 11:02:16
听起来你想要EF能够翻译这个表达式。这限制了我们可以使用的模式类型。下列措施应能发挥作用:
FractionExpression =
(SumDenominatorExpression == 0)
? (int?)null /*default value - pick what you want*/
: (SumNumeratorExpression / SumDenominatorExpression);
(我正在以C#的形式编写表达式树,以便输入速度。)
由于EF不支持具有变量的树,因此需要两次使用SumDenominatorExpression
表达式。希望Server将对其进行优化,并只对其进行一次评估。
https://stackoverflow.com/questions/34384449
复制相似问题