2012-02-27 11 views
11

Estoy usando LINQ to SQL para manejar la base de datos que consulta una aplicación en la que estoy trabajando.Comprobando automáticamente relaciones NULL con consultas LINQ

A los efectos de este ejemplo, imagina que tengo algunas mesas al igual que

- Company 
- Product 
- Item 
- Order 

y digamos que una Company tiene 0 o más Products, un Product tiene 0 o más Items, y un Item tiene 0 o más Orders.

Ahora vamos a lo que han obtenido una lista de Orders, algo así como:

IQueryable<Order> myOrders = GetMyOrders(); 

Ahora digamos que desea consultar los pedidos de un determinado Company.Name, pero tienen una situación en la que cada tabla ID padre puede ser NULL (sé que esto no parece lógico con mis datos de ejemplo, pero es sólo un ejemplo)

Haciendo la suposición de que no hay NULL identificadores de los padres que podía hacer esto:

var filteredOrders = myOrders.Where(x => x.Item.Product.Company.Name == "Company1"); 

Esto funcionaría bien, sin embargo, debido a que podría haber NULL valores de identificación principal, necesito verificar cada objeto principal para asegurarme de que no sea null antes de consultar al siguiente padre (de lo contrario recibiré una excepción). Así que hago algo así como:

var filteredOrders = myOrders.Where(x => 
    x.Item != null && 
    x.Item.Product != null && 
    x.Item.Product.Company != null && 
    x.Item.Product.Company.Name == "Company1"); 

Así que mi pregunta: ¿Hay una manera mejor (en términos de legibilidad y facilidad de codificación) para hacer esto de tener que incluir todos los cheques nulos? Cualquier padre nulo encontrado en el camino debería resultar en la exclusión de la lista resultante.

Por favor, no hay sugerencias para la prevención de los padres nulos, la base de datos no se verá cambiar (y es perfectamente válido de todos modos) pattren

+0

Mejor que en más rendimiento? No lo creo. No puedo pensar de todos modos, puedes deshacerte de todos esos controles 'nulos'. Mejor en cuanto a código más bonito? Me gustaría ir con la sugerencia de Lonli-Lokli. – InBetween

+0

@InBetween: Lo siento, cuando digo mejor, quise decir más para leer. Pero teniendo en cuenta mi comentario a la publicación de Lonli-Lokli, donde mencioné el deseo de finalmente ejecutarlo como una consulta SQL y no devolver primero todos los resultados – musefan

+0

Suena como una aplicación perfecta para uniones internas, que eliminará todos los elementos con referencias nulas . Únase a todas las tablas y filtre el resultado por nombre de compañía. (Pero esto no será más legible) – Stephan

Respuesta

3

no es conocida (ver modelo objeto nulo). También puede leer this article

+1

He leído ese artículo y ciertamente fue interesante. Sin embargo, debido a mi uso, me pregunto si esto sería apropiado para mí. Suponiendo que su sugerencia es crear un método de extensión, me temo que esto tendrá un gran impacto en mi desempeño en el sentido de que estoy usando IQueryable y no quiero ejecutar la consulta en todos los resultados. Por supuesto, supongo que tendré que hacer esto (por ejemplo, trabajo con una lista en su lugar) - tal vez con esto esté la mente me quede con tener que hacer las cosas a lo largo ... ¿algún pensamiento? – musefan

+0

Luego debe escribir su propia implementación de proveedor de linq-a-sql y combinar esos métodos de extensión en consultas SQL como se sugiere arriba. O simplemente puede escribir esas consultas desde cero. –