实体框架6过滤子对象

Posted

技术标签:

【中文标题】实体框架6过滤子对象【英文标题】:Entity framework 6 filter child object 【发布时间】:2015-03-10 20:17:33 【问题描述】:

我正在尝试使用 EF6 从数据库中获取数据。 我有两节课

public class Manufacturer

  public int Id get;set;
  public string Name get;set;
  public bool Enabled get;set;
  public virtual IList<Product> Products get;set;


public class Product

  public int Id get;set;
  public string Name get;set;
  public bool Enabled get;set;
  public virtual Manufacturer Manufacturer get;set;

我只需要获得已启用产品的已启用制造商 我尝试了以下方法:

var results = _context.Manufacturer
              .Where(m => m.Enabled)
              .Where(m => m.Products.Any(p => p.Enabled))
              .Select(m => new
              
                  Manufacturer = m;
                  Product = m.Products.Where(p => p.Enabled)
              );

不幸的是,子对象没有被填充。 “产品”列表总是充满未“启用”的产品 有什么想法吗?

【问题讨论】:

您不能使用导航属性来访问相关实体的子集。 我害怕这样的事情。我将使用 Dapper 进行基本数据访问 【参考方案1】:

你可以反过来。也尝试包含相关对象。

var r = context.Products.Include("Manufacturer")
               .Where(p=>p.Enabled && p.Manufacturer.Enabled);

【讨论】:

【参考方案2】:

你可以这样做。但我检查了你的代码,它也可以工作。我不知道您为什么没有启用产品...

var manufacturers = (from o in _context.Manufacturer
                      where o.Enabled
                      select
                      new
                      
                          manufacturers  = o,
                          products = o.Products.Where(c=>c.Enabled).ToList()
                      ).ToList();

【讨论】:

以上是关于实体框架6过滤子对象的主要内容,如果未能解决你的问题,请参考以下文章

实体框架4:使用自我跟踪实体的过滤器进行预先加载(包括)

实体框架 6:将子对象添加到父列表与将子对象的导航属性设置为父对象

如何阻止实体框架尝试保存/插入子对象?

如何过滤嵌套集合实体框架对象?

实体框架6过滤您访问的数据

具有过滤索引的实体框架 - “无法在对象中插入重复的键行”