如何使用带条件的C#MVC检索嵌套实体?

时间:2016-05-27 18:40:09

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

我们说我有像这个大陆这样的三级实体层次结构 - >国家 - >市。

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

我有一份大陆实体清单,每个大陆实体都有一个国家清单,每个国家都有一个城市清单。

所有entites都有一个Deleted布尔属性。

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

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

var allContinents = context.Continents.ToList();

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

我正在做的事情就是将所有内容都记入内存并删除已删除的项目,但我不想带来无用的数据。

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:3)

解决方案#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();

答案 1 :(得分:0)

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

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

  

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

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