c# - NULLIF 的表达式方法(带 Divide)

标签 c# .net sql-server linq expression-trees

我正在使用 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/

相关文章:

c# - 需要 lambda 的 DbQuery.Include() 重载去了哪里?

.net - 强制 .NET Windows 应用程序。以英文形状显示数字

sql-server - 如何在 SQL Server 中使用 row_number()

sql - 如何使用 PowerShell 编辑 SQL 作业步骤

c# - 防止 MigraDoc 中的段落拆分

c# - EF 4.1 预加载前 5 个子记录是否可能?

c# - DotNetZip 无法压缩大量条目

c# - 是否可以在 C# 中为一个类型编写多个迭代器?

sql-server - 为什么这个 COALESCE 语句中会发生这种隐式类型转换?

c# - WPF XAML 限定属性值导致异常