2011-07-21 18 views
12

¿Cuál sería la sintaxis correcta en LINQ para buscar registros que no son nulos? Estoy usando el siguiente código pero no sirvió para nada.no nulo en LINQ

Muchas gracias por cualquier ayuda.

   var list = (from t in dal.table 
          where t.name != null); 
+1

¿Cuál es el tipo de datos de nombre? – Clayton

Respuesta

23

Se olvidó de select.

var list = (from t in dal.table 
      where t.name != null 
      select t); 
+0

Gracias, me olvidé de eso. Pero cuando tengo el select todavía no obtengo los registros que tienen un valor en el campo de nombre. – MdeVera

+0

@MdeVera: ¿Necesitas 'string.IsNullOrEmpty'? (No estoy seguro, solo una conjetura.) – Mehrdad

+0

@MdeVera: Asegúrate de que sean realmente nulas. El 'seleccionar' faltante es todo lo que puedo pensar en este momento – BoltClock

2

me encontré con el mismo comportamiento extraño. El código C# es

public DbSet<Document> Documents { get; set; } 
List<Document> = Documents 
    .Where(d => d.BusinessId = 818) 
    .Where(d => d.CurrencyId != null) 
    .ToList(); 

pero la instrucción SQL generada es la siguiente:

exec sp_executesql N'SELECT 
[Extent1].[DocumentId] AS [DocumentId], 
[Extent1].[DateCreated] AS [DateCreated], 
... 
FROM [dbo].[Documents] AS [Extent1] 
WHERE [Extent1].[BusinessId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=818  

Claramente LINQ hace caso omiso de la cláusula (d => d.CurrencyId! = Null) .Where.

Mi solución fue la siguiente:

List<Document> = Documents 
    .Where(d => d.BusinessId = 818) 
    .ToList() // <== Gel all documents and filter in memory 
    .Where(d => d.CurrencyId != null) 
    .ToList(); 

Nota: Técnicamente mover el filtro no es nulo de LINQ a SQL para objetos LINQ a.

Muy ineficaz ya que seleccionamos TODOS los documentos en la memoria y los filtramos allí (en lugar de filtrar en el nivel db).

En mi caso, el número de registros suele ser pequeño, por lo que la solución funcionó para mí.

+0

Esto sugeriría que su modelo no coincide con la base de datos real, que el modelo es para una base de datos donde 'CurrencyId' no puede contener nulos. – hvd

Cuestiones relacionadas