validar not net framework empty check c# sql linq isnull

c# - not - validar null en linq



Equivalente de SQL ISNULL en LINQ? (4)

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

Tengo un join 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 admite nulos (xx.online) ¿cómo puedo establecer esto en falso si es nulo?


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 es un valor que no admite nulos. tipo.".

Encuentro que puedo resolver esto al convertir la secuencia en un tipo anulable. SUM y los otros operadores agregados no arrojan 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

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 arroja una excepción cuando no coinciden las filas).


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

( aa / xx podría ser intercambiable (un error tipográfico en la pregunta); la pregunta original habla de 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 a favor, he investigado más ... ¡el hecho es que este es el enfoque correcto! Aquí hay un ejemplo sobre 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?


Parece que el tipo es booleano y, por lo tanto, nunca puede ser nulo y debe ser falso de manera predeterminada.


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