Pregunta

En SQL puede ejecutar un ISNULL (nulo, '') ¿cómo haría esto en una consulta de linq?

Tengo una combinación en esta consulta:

var hht = from x in db.HandheldAssets
        join a in db.HandheldDevInfos on x.AssetID equals a.DevName into DevInfo
        from aa in DevInfo.DefaultIfEmpty()
        select new
        {
        AssetID = x.AssetID,
        Status = xx.Online
        };

pero tengo una columna que tiene un tipo de bit que no es anulable (xx.online) ¿cómo puedo configurar esto en falso si es nulo?

¿Fue útil?

Solución

Dado que aa es el conjunto / objeto que podría ser nulo, ¿puede verificar aa == null ?

( aa / xx puede ser intercambiable (un error tipográfico en la pregunta); la pregunta original habla sobre xx pero solo define aa )

es decir,

select new {
    AssetID = x.AssetID,
    Status = aa == null ? (bool?)null : aa.Online; // a Nullable<bool>
}

o si desea que el valor predeterminado sea false (no null ):

select new {
    AssetID = x.AssetID,
    Status = aa == null ? false : aa.Online;
}

Actualizar; En respuesta al voto negativo, he investigado más ... ¡el hecho es que este es el enfoque correcto! Aquí hay un ejemplo en Northwind:

        using(var ctx = new DataClasses1DataContext())
        {
            ctx.Log = Console.Out;
            var qry = from boss in ctx.Employees
                      join grunt in ctx.Employees
                          on boss.EmployeeID equals grunt.ReportsTo into tree
                      from tmp in tree.DefaultIfEmpty()
                      select new
                             {
                                 ID = boss.EmployeeID,
                                 Name = tmp == null ? "" : tmp.FirstName
                        };
            foreach(var row in qry)
            {
                Console.WriteLine("{0}: {1}", row.ID, row.Name);
            }
        }

Y aquí está el TSQL, más o menos lo que queremos (no es ISNULL , pero está lo suficientemente cerca):

SELECT [t0].[EmployeeID] AS [ID],
    (CASE
        WHEN [t2].[test] IS NULL THEN CONVERT(NVarChar(10),@p0)
        ELSE [t2].[FirstName]
     END) AS [Name]
FROM [dbo].[Employees] AS [t0]
LEFT OUTER JOIN (
    SELECT 1 AS [test], [t1].[FirstName], [t1].[ReportsTo]
    FROM [dbo].[Employees] AS [t1]
    ) AS [t2] ON ([t0].[EmployeeID]) = [t2].[ReportsTo]
-- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

QED?

Otros consejos

Puede usar el operador ?? para establecer el valor predeterminado, pero primero debe establecer la propiedad Nullable en true en su archivo dbml en el campo requerido ( xx.Online )

var hht = from x in db.HandheldAssets
        join a in db.HandheldDevInfos on x.AssetID equals a.DevName into DevInfo
        from aa in DevInfo.DefaultIfEmpty()
        select new
        {
        AssetID = x.AssetID,
        Status = xx.Online ?? false
        };

A menudo tengo este problema con las secuencias (a diferencia de los valores discretos). Si tengo una secuencia de entradas y quiero SUMARLAS, cuando la lista esté vacía, recibiré el error " InvalidOperationException: el valor nulo no se puede asignar a un miembro con el tipo System.Int32, que no es anulable tipo de valor. " ;.

Encuentro que puedo resolver esto al convertir la secuencia en un tipo que puede contener nulos. SUM y los otros operadores agregados no generan este error si una secuencia de tipos anulables está vacía.

Entonces, por ejemplo, algo como esto

MySum = MyTable.Where(x => x.SomeCondtion).Sum(x => x.AnIntegerValue);

se convierte en

MySum = MyTable.Where(x => x.SomeCondtion).Sum(x => (int?) x.AnIntegerValue);

El segundo devolverá 0 cuando ninguna fila coincida con la cláusula where. (el primero lanza una excepción cuando no coinciden las filas).

Parece que el tipo es booleano y, por lo tanto, nunca puede ser nulo y debería ser falso por defecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top