2012-07-17 31 views
5

Estamos utilizando el código de EF 4.3 primero y tienen un modelo de objetos de este modo:tabla Marco de la entidad según el tipo de - seleccionar sólo las columnas de tipo base

class Content { } 

class Product:Content { } 

class News:Content { } 

Estos son mapeados como la tabla por tipo.

Hay situaciones en las que solo quiero cargar las columnas que pertenecen a la tabla base, como por ejemplo una lista de todos los títulos de contenido. Sin embargo, una consulta como

from c in Content 
where c.IsDeleted == false 
select c 

resultados en algunos SQL muy desagradable con une a las otras dos mesas. ¿Hay alguna manera de obligar a EF a hacer solo una selección desde la tabla base sin unirse a las otras tablas?

Respuesta

3

TPT es problemático y las consultas generadas por EF suelen ser muy ineficaces. Además, tus expectativas son probablemente incorrectas. Linq-to-entities siempre devuelve el tipo real de entidad. No puede devolver la instancia del tipo Content si el registro es de hecho una entidad Product. Su consulta solo puede tener dos significados:

  • Devuelva todos los contenidos no eliminados - esto debe realizar uniones para crear una instancia correcta de un tipo real de entidades. La consulta devolverá la enumeración de instancias Content, Product y News.
  • Volver todos los no borrada Content casos - esto se debe, probablemente, una vez más se une a realizar para crear una instancia correctamente sólo los registros asignados a Content directamente (sin relación con Product y News). Ningún registro asignado a Product o News se devolverá en la enumeración. Esta consulta no es posible con Linq-to-entities; necesita utilizar el operador ESQL y OFTYPE ONLY.

Hay algunas cosas que usted puede intentar:

  • de actualización a .NET 4.5 - hay algunas mejoras para TPT consulta
  • proyección devolución de las propiedades en lugar de Content - Product y News también están contenidos por lo que nunca obtendrá consultas sin combinaciones si devuelve Content instancias de la consulta de Linq-a-entidades
+0

Gracias a todos por su respuesta. Actualizar a 4.5 está fuera de cuestión para el proyecto actual en el que estamos trabajando y que se espera entre en funcionamiento el próximo mes. Estamos planeando hacer tales consultas con procs almacenados. – madaboutcode

Cuestiones relacionadas