【问题标题】:Expression method for NULLIF (with Divide)NULLIF 的表达式方法(带 Divide)
【发布时间】:2015-12-20 18:40:59
【问题描述】:

我正在使用 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(我的提供程序)没有我可以包装 Call 表达式的 NULLIF 函数(即 System.Data.Entity.SqlServer.SqlFunctions)。

人们如何使用 C# 表达式树处理分母中的零?

更新 以下是我最终使用的表达方法:

 Expression.Condition(
   Expression.Equal(
     SumDenominatorExpression,
     Expression.Constant(0.0, typeof(double))
   ),
   Expression.Constant(0.0, typeof(double)),
   FractionExpression
 )

【问题讨论】:

  • 我真的不明白你是如何解决 divby0 问题的:默认情况下 C# 会抛出一个 divby0exception,在这种情况下你的目标是什么?
  • Expression.Divide 不允许分母中出现空值,但 SQL Server 允许使用 SQL 出现空值,因此问题是如何从 EF 中使用 NULLIF 函数。
  • 啊,好的。我可能以错误的方式翻译它(在荷兰语中,nul 表示零),因此它有点令人困惑。对不起。
  • @CommuSoft,很容易错过。无论如何,谢谢。

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


【解决方案1】:

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

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

(我将表达式树编写为 C# 以提高打字速度。)

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

【讨论】:

  • 评估 SumDenominatorExpression(即调用表达式)等于零作为 C# 表达式?这是有趣的部分......
  • 你这是什么意思?这能回答问题吗?
  • @MatthewYoung 这就是Expression.Equal() 的用途。
  • @usr,用您回答的结果代码更新了我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-03-19
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多