2012-06-15 59 views
5

我想知道是否有人知道,如果LINQ to SQL有能力生成包含ISNULL函數的TSQL代碼?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 

我敢打賭,答案是「不,它不能」,但我希望看到一些權威。

+0

@dbaseman您鏈接的問題與我所問的內容無關。 – arcain

+0

你說得對,我的錯。 – McGarnagle

回答

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

這是在從here「拿#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。

+0

我想看到一些不需要向生成的DataContext添加方法,但我不認爲這存在。 – arcain

1

我一直認爲ISNULL和COALESCE是等價的,除了可能的參數數量。

剛發現there are differences,所以問題是:這些差異對你有影響嗎?

+0

我的問題完全是關於能否說「是的,你可以寫一個LINQ to SQL查詢,它會發出包含ISNULL函數的TSQL」,或者「不,你不能」。所以,查詢行爲差異對我來說真的不重要。這完全是關於能力。 – arcain