NULLIF的表达式方法(带Divide)

本文关键字:Divide 方法 表达式 NULLIF | 更新日期: 2023-09-27 18:27:26

我使用的是C#4.5.2。我必须调用SumDenominator方法作为Expression.Divide方法的分母:

var SumDenominatorExpression = Expression.Call(
    null,
    SumDenominatorMethod,
    Parameter,
    SumDenominatorSelector
);

则稍后实际的CCD_ 3读取:

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
 )

NULLIF的表达式方法(带Divide)

听起来你希望EF能够翻译这个表达式。这限制了我们可以使用的模式的种类。以下内容应该有效:

FractionExpression =
  (SumDenominatorExpression == 0)
     ? (int?)null /*default value - pick what you want*/
     : (SumNumeratorExpression / SumDenominatorExpression);

(为了打字速度,我将表达式树写成C#。)

由于EF不支持包含变量的树,因此需要使用SumDenominatorExpression表达式两次。希望SQL Server能够对此进行优化,并且只对其进行一次评估。