Entity Framework - запрос, указывающий унаследованный тип для свойства навигации - PullRequest
8 голосов
/ 25 августа 2011

Итак, у меня есть объект, у которого есть свойство навигации, имеющее тип с иерархией классов. (имена субъектов изменены для защиты виновных)

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; }
}

Как я могу запросить сущности ParentClass, если одно из условий запроса - это, когда TheProperty имеет тип ChildSubClass, а InterestingProperty имеет определенное значение?

Я пробовал

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();

И получаю ошибку «Невозможно привести тип« ChildEntity »к типу ChildSubEntity». LINQ to Entities поддерживает только приведение типов примитивов модели данных Entity. ".

Мне нужно согласиться на выравнивание списка и применение этого условия после извлечения данных из хранилища сущностей. Можно ли записать это условие в форме, которую LINQ to Entities примет?

Для ясности, это упрощение, на самом деле я применяю ряд условий программно, строю выражение запроса с использованием LinqKit , причем некоторые условия относятся к свойствам ParentEntity, некоторые к ParentEntity. и некоторые другие дочерние объекты ParentEntity.

1 Ответ

16 голосов
/ 25 августа 2011

Вы должны использовать OfType, оно правильно разрешено LINQ to Entities.Используйте его против ChildEntity collection и выберите ParentEntities, связанный с выбранными ChildEntity объектами.

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