Equivalente de SQL ISNULL no LINQ?

No SQL você pode executar um ISNULL (null, ”) como você faria isso em uma consulta linq?

Eu tenho uma participação nesta 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 }; 

mas eu tenho uma coluna que tem um tipo de bit que é não anulável (xx.online) como posso definir isso para false se é nulo?

Como aa é o conjunto / object que pode ser nulo, você pode verificar aa == null ?

( aa / xx pode ser intercambiável (um erro de digitação na pergunta); a pergunta original fala sobre xx mas apenas define aa )

ou seja

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

ou se você quiser que o padrão seja false (não null ):

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

Atualizar; Em resposta ao voto negativo, eu investiguei mais … o fato é que essa é a abordagem correta! Aqui está um exemplo no 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); } } 

E aqui está o TSQL – praticamente o que queremos (não é ISNULL , mas está perto o suficiente):

 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?

Você pode usar o ?? operador para definir o valor padrão, mas primeiro você deve definir a propriedade Nullable como true em seu arquivo dbml no campo obrigatório ( 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 }; 

Muitas vezes tenho esse problema com seqüências (em oposição a valores discretos). Se eu tenho uma seqüência de ints, e eu quero SUM-los, quando a lista está vazia, vou receber o erro “InvalidOperationException: O valor nulo não pode ser atribuído a um membro com o tipo System.Int32 que é um valor não anulável tipo.”.

Eu acho que posso resolver isso, lançando a seqüência para um tipo anulável. SUM e os outros operadores agregados não lançam esse erro se uma seqüência de tipos anuláveis ​​estiver vazia.

Então, por exemplo, algo assim

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

torna-se

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

O segundo retornará 0 quando nenhuma linha corresponder à cláusula where. (o primeiro lança uma exceção quando nenhuma linha corresponde).

Parece que o tipo é booleano e, portanto, nunca pode ser nulo e deve ser falso por padrão.