【问题标题】:How to retrieve nested entities using C# MVC with conditions?如何使用带有条件的 C# MVC 检索嵌套实体?
【发布时间】:2016-05-27 18:40:08
【问题描述】:

假设我有一个实体的三层层次结构,比如这个大陆 -> 国家 -> 城市。

我目前正在使用代码优先来生成数据库。

我有一个大陆实体列表,每个大陆实体都有一个国家列表,每个国家都有一个城市列表。

所有实体都有一个 Deleted 布尔属性。

使用 dbContext,我怎样才能以相同的结构从数据库中检索所有未删除的项目,即最后我将只有一个大陆列表(更高级别)。

由于所有实体都是相关的,所以当我这样做时

var allContinents = context.Continents.ToList();

我得到了我拥有的所有实体的列表,但我不知道如何做一个好看的 LINQ 语句来按我的 Deleted 属性进行过滤。

我正在做的正确知道是将所有内容都放入内存并删除已删除的项目,但我不想带来无用的数据。

感谢任何帮助。谢谢

【问题讨论】:

  • 您在寻找 var allContinents = context.Continents.Where(x => x.Deleted != true).ToList() 吗?
  • @RyanIntravia 听起来他也希望过滤子实体。
  • @DVK 啊,我明白了,那我的评论肯定不会那样做。

标签: c# asp.net-mvc entity-framework linq


【解决方案1】:

解决方案 #1

免责声明:我是项目的所有者Entity Framework Plus

EF+ Query IncludeFilter 功能允许过滤相关实体。

context.Continents.Where(x => !x.IsDeleted)
       .IncludeFilter(x => x.Countries.Where(y => !y.IsDeleted))
       .IncludeFilter(x => x.Countries.Where(y => !y.IsDeleted)
                            .SelectMany(y => y.Cities).Where(y => !y.IsDeleted))
       .ToList();

维基:EF+ Query IncludeFilter

解决方案 #2

另一种技术是使用投影(这是我的库在后台所做的)

context.Continents.Where(x => !x.IsDeleted)
        .Select(x => new {Continents = x,
                          Countries = x.Countries.Where(y => !y.IsDeleted),
                          Cities = x.Countries.Where(y => !y.IsDeleted)
                                    .SelectMany(y => y.Cities).Where(y => !y.IsDeleted)
                })
        .ToList()
        .Select(x => x.Continents) // select only continents
        .ToList();

【讨论】:

    【解决方案2】:

    实体框架没有一种优雅的方式来过滤掉父实体中包含的子实体的选择,但是 EF 6 确实提供了拦截数据库命令的能力,因此您可以过滤软删除的实体而无需实际修改您的查询.

    https://msdn.microsoft.com/en-us/data/dn469464.aspx

    从 Entity Framework 6 开始,只要 Entity Framework 向数据库发送命令,该命令就可以被应用程序代码拦截。这最常用于记录 SQL,但也可用于修改或中止命令。

    还有一些其他选项,但在大多数情况下,没有一个是非常优雅或实用的。

    【讨论】:

    • 感谢您的回复。我正在尝试使用 WHERE 但我不知道如何在同一个语句中过滤掉像 City 这样的子实体。有任何想法吗?编辑:顺便说一句,重复不是一个大问题,因为应用程序正在使用存储库,所以所有查询都将集中在一个类中
    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2017-06-02
    • 2015-05-09
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多