【问题标题】:Filter Internal/cascading entities using Entity Framework使用实体框架过滤内部/级联实体
【发布时间】:2015-10-13 04:54:59
【问题描述】:

我有以下类结构,

public partial class Class1 : BaseEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [Required]
    [StringLength(500)]
    public string Description { get; set; }
    public virtual ICollection<Class2> Class2s  { get; set; }

}


public partial class Class2 : BaseEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [StringLength(500)]
    public string Description { get; set; }

    [Required]
    [ForeignKey("Class1")]
    public Guid Class1_Id  { get; set; }
    public virtual Class1 Class1 { get; set; }
}

public class BaseEntity
{
    public BaseEntity()
    {
        Meta = new MetaData();
    }
    public MetaData Meta  { get; set; }
}

public sealed class MetaData
{
    public bool Active { get; set; }
    public DateTimeOffset Created { get; set; }
    public DateTimeOffset? Modified { get; set; }

    public MetaData()
    {
        Created = DateTime.UtcNow;
        Active = true;
    }
}

现在使用 EF,

var dbContext.Class1
.Include(x=>x.Class2)
where (x=>x.Meta.Active)

现在我想使用上述查询加载/过滤/获取所有活动的 class2 实体。

我已尝试应用过滤器 .Include(x=>x.Class2).Where(y=>y.Meta.Active)

但它仅适用于 Class1。我想过滤所有活动的 class2 实体。

请帮忙。 提前致谢。

【问题讨论】:

  • .Include(x=>x.Class2) (我认为您的意思是 Class2s)将返回一个 IQueryable。所以在你的 where 调用中,你必须再次导航到第 2 类 .Include(x=>x.Class2s).Where(x=>x.Class2s.Any(y=>y.Meta.Active))
  • 不,那是行不通的。它不会过滤 class2

标签: c# entity-framework linq-to-entities


【解决方案1】:

要过滤导航属性集合,您可以使用方法Query。它看起来像这样:

context.Entry(blog) 
    .Collection(b => b.Posts) 
    .Query() 
    .Where(p => p.Tags.Contains("entity-framework") 
    .Load();

或者您可以执行以下操作:

dbContext.Class1
    .Select(s => new {class1 = s, navigationProps = s.Class2s.Where(w => w.Meta.Active)})
    .AsEnumerable()
    .Select(s => s.class1);

【讨论】:

  • 第二个查询正在工作。但我不想使用匿名对象。因为我有非常大的包含语句列表,它大约有 50 个子实体。
猜你喜欢
  • 1970-01-01
  • 2019-04-14
  • 2017-11-08
  • 1970-01-01
  • 2011-06-18
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多