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

arc*_*ain 5 c# linq-to-sql

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

我知道??在查询中使用coalesce operator():

from o in Table
where (o.Field ?? 0) > 0
select o
Run Code Online (Sandbox Code Playgroud)

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

SELECT [t0].[Field]
FROM [Table] AS [t0]
WHERE (COALESCE([t0].[Field],0)) > 0
Run Code Online (Sandbox Code Playgroud)

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

from o in Table
where (o.Field == null ? 0 : o.Field) > 0
select o
Run Code Online (Sandbox Code Playgroud)

将导致TSQL包含一个CASE语句:

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

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

SELECT [t0].[Field]
FROM [Table] AS [t0]
WHERE (ISNULL([t0].[Field],0)) > 0
Run Code Online (Sandbox Code Playgroud)

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

art*_*sql 3

我知道实现这一点的唯一方法是通过你自己的类,如下所示:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

这是从这里开始的“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();
Run Code Online (Sandbox Code Playgroud)

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