5

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

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

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

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

4

2 回答 2

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

这是从这里的“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。

于 2012-06-16T19:44:32.180 回答
1

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

但是,刚刚发现存在差异,所以问题是:这些差异对您来说重要吗

于 2012-06-16T21:06:15.460 回答