可以使用EF查询我的案例.(其中一个条件用于实体,另一个用于嵌套实体)

本文关键字:用于 实体 一个 嵌套 条件 另一个 查询 EF 我的 案例 可以使 | 更新日期: 2023-09-27 18:11:16

我有两个相互嵌套的实体,它们本身有一对多关系。

对我来说,它需要两个查询,以获得启用的模块(模块。IsEnabled == 1)和它们的ModuleScreen属性由也已启用的(ModuleScreen)填充。IsEnabled == 1) modulesscreen对象

是否有办法通过一个查询来查询这个?

我已经遇到了这个问题,问题是相同的,公认的答案表明它需要两个查询。

public class Module
{
    public virtual int Id
    {
        get;
        set;
    }
    public virtual int IsEnabled
    {
        get;
        set;
    }
    public virtual IEnumerable<ModuleScreen> ModuleScreen
    {
        get;
        set;
    }
public class ModuleScreen
{
    public virtual int Id
    {
        get;
        set;
    }
    public virtual int IsEnabled
    {
        get;
        set;
    }
    public virtual Module Module
    {
        get;
        set;
    }
}

可以使用EF查询我的案例.(其中一个条件用于实体,另一个用于嵌套实体)

您可以实现将需要的内容投射到匿名类型上:

var query=context.Modules
                 .Where(m=>m.IsEnabled == 1)
                 .Select(m=> new {  ModuleId= m.Id, 
                                    ModuleScreen=m.ModuleScreen.Where(m=>m.IsEnabled == 1)
                                 }
                        );

如果您不想使用匿名类型,您还可以创建另一个类来保存您想要投影的信息:

public class ModuleDTO
{
   public int Id{get; set;}
   public IEnumerable<ModuleScreen> ModuleScreens{get; set;}
}

然后你可以这样做:

var query=context.Modules
                 .Where(m=>m.IsEnabled == 1)
                 .Select(m=> new ModuleDTO{ Id= m.Id, 
                                            ModuleScreens=m.ModuleScreen.Where(m=>m.IsEnabled == 1)
                                          }
                        );

DTO只不过是一个容器类,它公开属性来保存您想要投影的信息。dto有助于进一步将表示与服务层和领域模型解耦。