我想知道是否有人明确知道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)
我打赌答案是"不,它不能",但我希望看到一些权威的东西.
我知道实现这一点的唯一方法是通过你自己的类,如下所示:
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。