代码之家  ›  专栏  ›  技术社区  ›  dagda1

实体框架一对多有条件

  •  0
  • dagda1  · 技术社区  · 9 年前

    [Table("Jobs")]
    public class Job
    {
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
       [Column("fID")]
       public int ID { get; set; }
    
       public virtual ICollection<Note> Notes { get; set; }
    }
    

    注释类如下所示:

    [Table("Note")]
    public class Note
    {
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      [Column("fID")]
      public int ID{get; set;}
    
      [Column("fld_int_NoteTypeID")]
      public int NoteTypeID { get; set; }
    }
    

     var job= context.Jobs.Include(x => x.Notes).FirstOrDefault(x => x.ID == jobId);
    

    我希望查询隐式添加Where NoteTypeId == 8 .

    1 回复  |  直到 9 年前
        1
  •  1
  •   Adil Mammadov    9 年前

    变通方法如何?添加 未映射 Notes集合 :

    [Table("Jobs")]
    public class Job
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Column("fID")]
        public int ID { get; set; }
    
        public virtual ICollection<Note> Notes { get; set; }
    
        [NotMapped]
        public ICollection<Note> FilteredNotes
        {
            get
            {
                return Notes.Where(m => m.NoteTypeId == 8);
            }
        }
    }
    

    但这种设计的问题是,当你选择工作时 var job = context.Jobs.Include(x => x.Notes).FirstOrDefault(x => x.ID == jobId); ,然后将所有便笺加载到内存中,然后可以从内存中访问筛选后的便笺,如 job.FilteredNotes 。但在使用时 LazyLoading

    var job = context.Jobs.FirstOrDefault(x => x.ID == jobId);
    var notes = job.FilteredNotes.ToList();
    

    使现代化

    你也可以试试 每个层次的表格(TPH) 地图绘制。您必须创建一个抽象类和派生类:

    public abstract class Note
    {
        public int Id { get; set; }
        public int NoteTypeId { get; set; }
    }
    
    public class JobNote : Note
    {
    }
    
    public class OtherNote : Note
    {
    }
    

    然后超控 OnModelCreating 方法:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Note>()
                    .Map<JobNote>(m => m.Requires("NoteTypeId").HasValue(8))
                    .Map<OtherNote>(m => m.Requires("NoteTypeId").HasValue(3)); // For example
    }
    

    请注意,我对TPH的了解不够。我只是想暗示一下。请进一步阅读 TPH .