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是等价的。
刚才发现存在差异 ,所以问题是:这些差异对你很重要吗?