【问题标题】:c# Linq query question with EF4 table per type Inheritancec# Linq 查询问题,每种类型的 EF4 表继承
【发布时间】:2010-07-05 05:04:47
【问题描述】:

我一直在寻找执行 linq 查询以获取基于特定子继承类型的对象图的方法。我可能说的有点不对,但我会尽力解释。

假设我有一个 EF4 模型,它有一个城市实体、一个细分实体、一个房屋实体和一个特征实体。城市与细分是一对多的关系。细分与房屋具有一对多的关系。房屋与特征具有一对多的关系。两个实体子类型的特征实体。让我们称它们为游泳池和车道。

c# linq 查询是什么来查询所有城市的对象图,这些城市的房屋具有特征。OfType "Pool",城市位于图的根部?

类似于: var city = from city in context.Cities where ??????选择城市

【问题讨论】:

    标签: c# entity-framework-4


    【解决方案1】:

    您需要使用 IQueryable.OfType 方法来限制您真正感兴趣的类型。 EF4 IQueryable 提供程序将负责其余的工作,并为您生成正确的 SQL 查询。

    Queryable.OfType<T>

    以下查询应该可以工作(假设您在模型中定义了所有正确的导航关系):

    var cities = from city in context.Cities
                 from house in city.Houses
                 from pool in house.Features.OfType<Pool>
                 where pool.MaxDepth == 6
                 select city;
    

    【讨论】:

    • 非常感谢。上面的查询运行良好。它确实返回了同一运营商的多个实例,所以我在末尾添加了一个 distint。你知道如何急切加载图表吗?我尝试像往常一样使用 .Include("NAVIGATION PATH") ,但这并没有返回图中的任何子对象。 var city = from city in context.Cities.Include("Houses.Features.Pools")... 显然我是新手。
    • 你几乎拥有它,但你犯了一个错误。池是功能...功能没有池。您的包含路径需要像这样:context.Cities.Include("Houses.Features"),这将包括所有功能。您的房屋类型的 Features 属性始终代表所有功能。您不能有选择地仅使用某些功能来填充该集合......比如说池......随意。您需要创建一个 Pools 属性来表示适当的关系类型来实现这一点。
    • Jrista - 再次感谢您的帮助。您当然澄清了我应该如何考虑/查询“功能”层次结构。我确实发现即使进行了建议的更改,也没有执行包含命令。我做了一个额外的搜索并想出了这篇文章。跟随它解决了这个问题。似乎是一个错误或“早期”包含请求正在丢失的东西。 stackoverflow.com/questions/936558/… 问候,DaveW
    • @DaveW:只是关于 StackOverflow (SO) 文化的快速提示。如果有人可以接受地回答您的问题,则习惯性地对答案进行投票,如果这是您问题的正确答案,请接受答案。这将提高您的接受率……您会希望将其保持在接近 100% 的水平,以让人们回答您的问题。 ## 至于包含错误,我实际上认为它从 EF v1.0 时代就已经存在......它非常烦人,并导致一些难看的语法。我很确定他们知道这一点,但他们有一些更关键的问题需要首先使用 EF 4 解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多