我想知道是否有人知道确切如果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
我打赌的回答是“不,这不可能,”但我想看到的东西权威。
我知道解决这个问题的唯一方法是通过你自己的类,如下所示:
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()。
我始终认为ISNULL和COALESCE是等同的,除了可能的参数的数量。
只要发现有差异 ,不过,这样的问题是:这些差异怎么了你?