c# - 可以使用 EF 通过单个查询来查询我的案例吗? (实体的条件和嵌套实体的条件)

标签 c# entity-framework

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

对我来说,它需要两个查询来获取已启用的模块 (Module.IsEnabled == 1) 及其由也已启用 (ModuleScreen.IsEnabled == 1) ModuleScreen 对象填充的 ModuleScreen 属性。

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

我已经见过this问题相同且接受的答案表明它需要两个查询。

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;
    }

}

最佳答案

您可以将您需要的内容转换到匿名类型上:

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 有助于进一步将表示与服务层和域模型分离。

关于c# - 可以使用 EF 通过单个查询来查询我的案例吗? (实体的条件和嵌套实体的条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415425/

相关文章:

c# - 连接表有两个以上字段的 Entity Framework 中的多对多关系?

c# - Linq 查询 Where on the Joined table without needed join

c# - .NET core 3.1 中未找到 MenuItem 和 ContextMenuItem

c# - 将 bool 表达式字符串转换为 .NET 代码

c# - Entity Framework 将日期时间转换为字符串

c# - 将遗留专有 Web 应用程序重写为 MVC3/Entity-Code-First

entity-framework - Entity Framework -使用GUID作为EntityKey进行SaveChanges

c# - 得到;设置;使用 DateTime 来验证 .TryParse?

c# - 将 VB6 .dll 文件转换为 .net dll

c# - 从对象方法中调用管理器/服务类好吗?