7

Tengo una entidad que tiene una propiedad de navegación que tiene un tipo con una jerarquía de clases. (Nombres de entidad cambiados para proteger a los culpables)Entity Framework - consulta que especifica el tipo heredado para la propiedad de navegación

class ParentEntity 
{ 
    virtual ChildEntity TheProperty { get; set; } 
    virtual string AnotherProperty { get; set; } 
    virtual string AnotherProperty2 { get; set; } 
} 

class ChildEntity 
{ 
} 

class ChildSubEntity : ChildEntity 
{ 
    virtual string InterestingProperty { get; set; } 
} 

¿Cómo se puede consultar para las entidades que ParentClass, con uno de mis condiciones de consulta siendo donde theproperty es de tipo ChildSubClass y InterestingProperty tiene un valor particular?

He intentado

ObjectContext context = GetContext(); 
var result = context.ParentEntities. 
    Where(e => e.AnotherProperty == AnotherInterestingValue). 
    Where(e => e.TheProperty is ChildSubEntity). 
    Where(e => ((ChildSubEntity)e.TheProperty). 
    InterestingProperty == InterestingValue). 
    ToList(); 

Y sale el error "No se puede convertir el tipo 'ChildEntity' al tipo 'ChildSubEntity'. LINQ a Entidades sólo admite fundición modelo de entidad de datos de tipos primitivos.".

Estoy teniendo que conformarme con aplanar la lista y aplicar esta condición después de que los datos se hayan recuperado del almacén de entidades. ¿Es posible escribir esta condición en un formulario LINQ para que las entidades lo acepten?

Para ser claros, esta es una simplificación, en realidad estoy aplicando una serie de condiciones programáticamente, construyendo una expresión de consulta usando LinqKit, con algunas de las condiciones en las propiedades de ParentEntity, algunas en ParentEntity y algunas en otras entidades menores de ParentEntity.

Respuesta

14

Tiene que usar OfType es resuelto correctamente por LINQ to Entities. Úselo contra la colección ChildEntity y seleccione ParentEntities relacionado con objetos seleccionados ChildEntity.

ObjectContext context = GetContext(); 
var result = context.ChildEntities.OfType<ChildSubEntity> 
.Where(e => e.InterestingProperty == InterestingValue) 
.SelectMany(e = > e.ParentEntity) 
.ToList(); 
+0

Buena respuesta. Sin embargo, tengo muchos otros criterios sobre ParentEntity que deben cumplirse, voy a editar la pregunta para dejarlo en claro. – SamStephens

+0

Simplemente agregue 'Donde' en' SelectMany' para filtrar 'ParentEntity' –

+0

Ah, ahora que * es * interesante. Tendré una jugada y te llamaré. – SamStephens

Cuestiones relacionadas