LINQ to SQL可以生成包含ISNULL函数的TSQL吗?

我想知道是否有人明确知道LINQ to SQL是否具有生成包含ISNULL函数的TSQL代码的能力?

我知道在查询中使用coalesce运算符( ?? ):

 from o in Table where (o.Field ?? 0) > 0 select o 

将导致LINQ to SQL发出COALESCE函数:

 SELECT [t0].[Field] FROM [Table] AS [t0] WHERE (COALESCE([t0].[Field],0)) > 0 

并且,在查询中使用条件运算符( ?: 🙂

 from o in Table where (o.Field == null ? 0 : o.Field) > 0 select o 

将导致TSQL包含CASE语句:

 SELECT [t0].[Field] FROM [Table] AS [t0] WHERE ( (CASE WHEN [t0].[Field] IS NULL THEN 0 ELSE [t0].[Amount] END)) > 0 

但是,LINQ to SQL是否可以强制生成包含ISNULL TSQL代码,如下所示?

 SELECT [t0].[Field] FROM [Table] AS [t0] WHERE (ISNULL([t0].[Field],0)) > 0 

我打赌答案是“不,它不能”,但我希望看到一些权威的东西。

我知道完成此任务的唯一方法是通过您自己的类,如下所示:

 public partial class LocalTestDataContext { [Function(Name = "IsNull", IsComposable = true)] [return: Parameter(DbType = "NVarChar(MAX)")] public string IsNull( [Parameter(Name = "field", DbType = "NVarChar(MAX)")] string field, [Parameter(Name = "output", DbType = "NVarChar(MAX)")] string output) { return ((string)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), field, output).ReturnValue)); } } 

这是从这里 “Take#3”。

 var ctx = new LocalTest.LocalTestDataContext(); var query = from c in ctx.Categories orderby ctx.IsNull(c.Description1, "") + ctx.IsNull(c.Description2, "") select c; query.Dump(); 

并将使用ISNULL()生成T-SQL。

除了可能的参数数量外,我一直认为ISNULL和COALESCE是等价的。

刚才发现存在差异 ,所以问题是:这些差异对你很重要吗?