【问题标题】:How can I use IQueryable<T>.Include with Inheritance如何使用 IQueryable<T>.Include 和继承
【发布时间】:2012-01-08 11:19:56
【问题描述】:

我想我使用 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);

如果有任何需要澄清的地方,请告诉我,我绝对可以用我尝试过的各种东西来填写这篇文章。

【问题讨论】:

  • Include 和继承不能很好地结合在一起。简单的建议是不要使用 Include 在单个查询中获取多个派生类型的关系,尤其是不要在 TPT 中使用 Include(直到 .NET 4.5 发布)。
  • 那么在延迟/急切加载方面我有哪些替代方案?我需要的数据是这个抽象子类的列表,这个数据包括几个特定于某些子类的关系。如何在不诉诸 Include 的情况下检索此 TPT 数据?

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


【解决方案1】:

这样的事情可能会奏效:

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

【讨论】:

  • 由于我的最终目标是拥有一个带有 List 的 RandomObject,它是子类列表的串联,我该如何解决呢?现在我只是从 result.RandomObj 创建一个 RandomObject,然后将 List 属性设置为 Result.SubclassAList、Result.SubclassBList 等的串联。看起来很混乱,但这是最好的方法吗?
  • @OpticalDelusion - 我真的不确定。我认为您应该将其作为一个新问题提出。
猜你喜欢
  • 1970-01-01
  • 2014-04-11
  • 2020-12-22
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多