【问题标题】:Can LINQ to SQL generate TSQL containing the ISNULL function?LINQ to SQL 可以生成包含 ISNULL 函数的 TSQL 吗?
【发布时间】:2012-06-15 04:38:05
【问题描述】:

我想知道是否有人明确知道 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

我敢打赌答案是“不,它不能”,但我想看看权威的东西。

【问题讨论】:

  • @dbaseman 您链接的 Q 看起来与我的要求无关。

标签: c# linq-to-sql


【解决方案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));
    }
}

这是来自here 的“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。

【讨论】:

  • 我希望看到不需要向生成的 DataContext 添加方法的东西,但我认为不存在。
【解决方案2】:

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

不过,刚刚发现there are differences,所以问题是:这些差异对你来说重要吗?

【讨论】:

  • 我的问题完全是关于能否说“是的,您可以编写一个 LINQ to SQL 查询,该查询将发出包含 ISNULL 函数的 TSQL”或“不,您不能”。因此,查询行为差异对我来说真的无关紧要。一切都与能力有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多