2009-12-06 20 views
5

He aquí una pequeña LinqToSql GOTCHA:atajos condicionales en consulta LinqToSql

// Returns the number of counties in a state, 
// or all counties in the USA if the state is null 
public static int CountCounties(State s) { 
    var q = 
    from cy in County.GetTable() // my method to get the ITable 
    where (s == null || s.Code == cy.StateCode) // shortcut OR operator, right...? 
    select cy; 
    return q.Count(); 
} 

Adivina lo que - si se pasa un objeto nulo State a este método, se obtiene una excepción de referencia nula! ¡Parece que LinqToSql no usa el operador de acceso directo || como un acceso directo!

de crédito respuesta va a quienquiera que proponga la mejor solución & explicación para esto.

+0

¿Es esto LinqToSql? –

+0

En 'normal' Linq una consulta similar funciona bien para mí. –

+0

Sí, es LinqToSql - lo siento, se editará la pregunta –

Respuesta

6

Si se trata de LINQ to SQL entonces Recuerde que LINQ es sólo parseando sus consultas en SQL.

Por lo tanto se enviaba ambos de sus cláusulas donde la base de datos, por lo tanto, la excepción. No encuentro esto realmente sorprendente, aunque podría decirse que está mal.

Usted sólo tendrá que hacer una verificación independiente.

if (!string.isNullOrEmpty(state.statecode) 
    q = q.where(s => s.code == state.statecode 
+0

+1 Me gusta la idea de agregar a la consulta utilizando la lambda. –

3

Esto no está relacionado con LINQ en general. En este caso, el proveedor LINQ-to-SQL intenta analizar la expresión lambda y convertirla en una consulta TSQL. No puede hacer demasiadas suposiciones basadas en su expresión, ya que está tratando de delegar la mayor parte del trabajo a la base de datos.

Para resumir, el proveedor simplemente no puede traducir a SQL.