2012-06-15 21 views
5

Mi chiedevo se qualcuno sa in modo definitivo se LINQ to SQL ha la capacità di generare codice TSQL che contiene la funzione ISNULL?LINQ to SQL può generare TSQL contenente la funzione ISNULL?

Sono consapevole del fatto che utilizzando l'operatore coalesce (??) in una query:

from o in Table 
where (o.Field ?? 0) > 0 
select o 

causerà LINQ to SQL per emettere la funzione COALESCE:

SELECT [t0].[Field] 
FROM [Table] AS [t0] 
WHERE (COALESCE([t0].[Field],0)) > 0 

E, che l'utilizzo del operatore condizionale (?:) in una query:

from o in Table 
where (o.Field == null ? 0 : o.Field) > 0 
select o 

si tradurrà in TSQL contenente un CASE dichiarazione:

SELECT [t0].[Field] 
FROM [Table] AS [t0] 
WHERE (
    (CASE 
     WHEN [t0].[Field] IS NULL THEN 0 
     ELSE [t0].[Amount] 
    END)) > 0 

Ma, può LINQ to SQL essere costretto a generare il codice TSQL che contiene ISNULL come la seguente?

Scommetto che la risposta è "no, non può", ma mi piacerebbe vedere qualcosa di autorevole.

+0

@dbaseman La Q che hai collegato sembra estranea a quello che sto chiedendo. – arcain

+0

Hai ragione, mio ​​errore. – McGarnagle

risposta

3

L'unico modo che conosco di farlo è tramite la propria classe in questo modo:

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

Questa è in fase di "Take # 3" da here.

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

E genererà T-SQL con ISNULL().

+0

Mi piacerebbe vedere qualcosa che non richiede l'aggiunta di metodi al DataContext generato, ma non penso che esista. – arcain

1

Ho sempre considerato ISNULL e COALESCE equivalenti, tranne il numero di parametri possibili.

Appena trovato che there are differences, quindi, la domanda è: queste differenze sono importanti per te?

+0

La mia domanda riguarda interamente la possibilità di dire "sì, è possibile scrivere una query LINQ su SQL che emetterà TSQL contenente la funzione ISNULL" o "no, non è possibile". Quindi, le differenze sul comportamento delle query non mi importano davvero. Si tratta di capacità. – arcain