LINQ可以到SQL生成包含ISNULL功能TSQL?(Can LINQ to SQL genera

2019-07-29 22:26发布

我想知道是否有人知道确切如果LINQ to SQL中具有生成包含TSQL代码的能力ISNULL功能?

我知道,使用聚结操作符( ??在查询中):

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被强迫生成包括TSQL代码ISNULL像下面这样?

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

我打赌的回答是“不,这不可能,”但我想看到的东西权威。

Answer 1:

我知道解决这个问题的唯一方法是通过你自己的类,如下所示:

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));
    }
}

这是“拿#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();

并会产生T-SQL与ISNULL()。



Answer 2:

我始终认为ISNULL和COALESCE是等同的,除了可能的参数的数量。

只要发现差异 ,不过,这样的问题是:这些差异怎么了你?



文章来源: Can LINQ to SQL generate TSQL containing the ISNULL function?