2012-06-15 10 views
5

Me preguntaba si alguien sabe definitivamente si LINQ to SQL tiene la capacidad de generar código TSQL que contiene la función ISNULL?¿Puede LINQ to SQL generar TSQL que contenga la función ISNULL?

Soy consciente de que el uso del operador se unen (??) en una consulta:

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

hará que LINQ a SQL para emitir la función COALESCE:

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

Y, que el uso de la operador condicional (?:) en una consulta:

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

resultará en TSQL que contenga una declaración CASE:

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

embargo, puede LINQ a SQL ser obligado a generar código TSQL que contenga ISNULL como el siguiente?

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

Apuesto a que la respuesta es "no, no puede", pero me gustaría ver algo autoritario.

+0

@dbaseman La Q que enlazó parece no relacionada con lo que estoy preguntando. – arcain

+0

Tienes razón, mi error. – McGarnagle

Respuesta

3

La única forma que conozco de lograr esto es a través de su propia clase, así:

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

Ésta es bajo "Take # 3" de 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(); 

Y generará T-SQL con ISNULL().

+0

Me gustaría ver algo que no requiera agregar métodos al DataContext generado, pero no creo que exista. – arcain

1

Siempre consideré que ISNULL y COALESCE son equivalentes, excepto por el número de parámetros posibles.

Acabo de encontrar que there are differences, entonces, la pregunta es: ¿estas diferencias le importan a usted?

+0

Mi pregunta es sobre poder decir "sí, puedes escribir una consulta LINQ a SQL que emitirá TSQL que contenga la función ISNULL" o "no, no puedes". Entonces, las diferencias de comportamiento de las consultas realmente no me importan. Se trata de la capacidad. – arcain