我如何使用IQueryable <t> .Include with Inheritance </t>

时间:2011-11-29 03:07:43

标签: linq entity-framework linq-to-entities ef-code-first

我认为我使用TPT继承。我有一个抽象的父类和三个子类。我想要的是一个基本的查找功能,但我需要明确做包含。我的问题是如何根据类型包含不同的属性。

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

RandomObject的每个实例都有一个抽象超类的集合。有一定数量的已知子类(如果人们需要名字,我们可以称之为SubclassA和SubclassB)。

我一直在尝试各种Include语句,例如

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

如果有任何澄清需要让我知道,我绝对可以用我尝试过的各种事情来填补这篇文章。

1 个答案:

答案 0 :(得分:0)

这样的事可能有用:

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 急切加载,并且可以衡量所有其他超类的集合。