2012-06-15 10 views
5

Ich frage mich, ob jemand definitiv weiß, ob LINQ to SQL die Fähigkeit hat, TSQL-Code zu generieren, der die ISNULL-Funktion enthält?Kann LINQ to SQL TSQL generieren, das die ISNULL-Funktion enthält?

Ich bin mir bewusst, dass der coalesce Operator (??) in einer Abfrage:

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

werden LINQ dazu führen, SQL die COALESCE Funktion zu emittieren:

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

Und, dass die Verwendung von Bedingter Operator (?:) in einer Abfrage:

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

wird in TSQL führen eine CASE Anweisung enthält:

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

Aber kann LINQ to SQL in Erzeugen von TSQL-Code umgewandelt werden, die ISNULL wie folgt enthält?

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

Ich wette die Antwort ist "nein, kann es nicht", aber ich möchte etwas autoritatives sehen.

+0

@dbaseman Das Q, das du verlinkt hast, steht in keinem Zusammenhang mit dem, was ich verlange. – arcain

+0

Sie haben Recht, mein Fehler. – McGarnagle

Antwort

3

Der einzige Weg, ich weiß, dies zu erreichen, ist über eine eigene Klasse wie folgt:

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

Dies ist unter von here „# 3 Take“.

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

Und wird T-SQL mit ISNULL() generieren.

+0

Ich möchte etwas sehen, das keine Methoden zum generierten DataContext hinzufügen muss, aber ich glaube nicht, dass es existiert. – arcain

1

Ich betrachtete ISNULL und COALESCE immer gleichwertig mit Ausnahme der Anzahl der möglichen Parameter.

Gerade gefunden, dass there are differences, aber die Frage ist: Sind diese Unterschiede für Sie wichtig?

+0

Meine Frage ist vollständig in der Lage zu sagen, entweder "Ja, Sie können eine LINQ to SQL-Abfrage schreiben, die TSQL mit der ISNULL-Funktion ausgeben wird" oder "Nein, Sie können nicht". Also, die Unterschiede im Abfrageverhalten sind mir egal. Es geht um die Fähigkeit. – arcain