Как я могу использовать IQueryable <T>. Включать с наследованием - PullRequest
2 голосов
/ 29 ноября 2011

Я думаю, что я использую наследование TPT. У меня есть абстрактный родительский класс и три подкласса. То, что я хочу, это базовая функция поиска, но мне нужно явно сделать, включает в себя. Моя проблема в том, как я могу включить различные свойства в зависимости от типа.

public List<RandomObject> FindAll(int someProperty)
{
    using (MyContext db = new MyContext())
    {
        var randomObjects = db.RandomObjects.Where(x => x.SomeProperty == someProperty);
    }
}

Каждый экземпляр RandomObject имеет коллекцию абстрактного суперкласса. Существует фиксированное количество известных подклассов (мы можем называть их SubclassA и SubclassB, если людям нужны имена).

Я пробовал различные операторы типа «Включить», например,

randomObjects = randomObjects.Include(x => x.Superclasses.OfType<SubclassA>().SubclassAOnlyProperty);

Если понадобится какое-либо разъяснение, просто дайте мне знать, я бы обязательно заполнил этот пост всеми видами вещей, которые я пробовал.

1 Ответ

0 голосов
/ 29 ноября 2011

Примерно так может работать:

var result = MyContext.randomObjects
    .Select(r => new
    {
        RandomObj = r,
        SuperclassesOfTypeA = r.Superclasses.OfType<SubClassA>().Select(subA => new {
            obj = subA,
            SubclassAOnlyProperty = subA.SubclassAOnlyProperty
        }),
        AllSuperClasses = r.Superclasses
    })
    .ToList();

Я думаю, что это даст вам коллекцию анонимных объектов в памяти, где RandomObj будет основным объектом, SuperclassesOfTypeA будет коллекцией анонимных объектов, представляющих ваши суперклассы типа SubClassA, с SubclassAOnlyProperty нетерпеливо загружен, и для хорошей меры коллекция всех ваших других суперклассов.

...