2014-10-23 2 views
1

У меня есть 2 таблицы Categories и Images категории является самостоятельной ссылкой с ParentId, как Nullable внешнего ключLINQ самостоятельно refenced фильтр таблицы отношение

Database Diagram Screenshot

Код первых классов

public class Category { 

    public int Id { get; set; } 
    public string Name{ get; set; } 
    public int? ParentId { get; set; } 
    public bool IsDeleted { get; set; } 
    public byte[] Timestamp { get; set; } 

    public virtual Category Parent { get; set; } 
    public virtual ICollection<Category> Parents { get; set; } 

    public virtual ICollection<Image> Images { get; set; } 
} 


Public class Image { 

    public int Id { get; set; } 
    public int? CategoryId { get; set; } 
    public string Source { get; set; } 
    public string Description { get; set; } 
    public bool IsDeleted { get; set; } 
    public byte[] Timestamp { get; set; } 

    // Foreign keys 
    public virtual Category Category { get; set; } 
} 


public class CategoryMap : EntityTypeConfiguration<Category> 
{ 
    public CategoryMap() 
    { 
     // Primary Key 
     HasKey(t => t.Id); 

     // Properties 
     Property(t => t.Name).IsRequired().HasMaxLength(250); 
     Property(t => t.Timestamp).IsRequired().IsFixedLength().HasMaxLength(8).IsRowVersion(); 

     // Table & Column Mappings 
     ToTable("Category"); 
     Property(t => t.Id).HasColumnName("Id"); 
     Property(t => t.ParentId).HasColumnName("ParentId"); 
     Property(t => t.Name).HasColumnName("Category"); 
     Property(t => t.IsDeleted).HasColumnName("IsDeleted"); 
     Property(t => t.Timestamp).HasColumnName("Timestamp"); 

     // Relationships 
     HasOptional(t => t.Parent).WithMany(t => t.Parents).HasForeignKey(d => d.ParentId).WillCascadeOnDelete(false); 

    #endregion 
} 


public class ProfileImageMap : EntityTypeConfiguration<ProfileImage> { 

    public ProfileImageMap() { 
     // Primary Key 
     HasKey(t => t.Id); 

     // Properties 
     Property(t => t.Source).IsRequired().HasMaxLength(255); 
     Property(t => t.Description).HasMaxLength(255); 
     Property(t => t.Timestamp).IsRequired().IsFixedLength().HasMaxLength(8).IsRowVersion(); 

     // Table & Column Mappings 
     ToTable("Images"); 
     Property(t => t.Id).HasColumnName("Id"); 
     Property(t => t.CategoryId).HasColumnName("CategoryId "); 
     Property(t => t.Source).HasColumnName("Source"); 
     Property(t => t.Description).HasColumnName("Description"); 
     Property(t => t.IsDeleted).HasColumnName("IsDeleted"); 
     Property(t => t.Timestamp).HasColumnName("Timestamp"); 

     // Relationships 
     HasOptional(t => t.Category).WithMany(t => t.Images).HasForeignKey(d => d.CategoryId); 

    } 

    #endregion 
} 

** Контекст **

public DbSet<Category> Categories { get; set; } 
    public DbSet<Image> Images { get; set; } 

вопрос, как я могу построить заявление LINQ, чтобы вернуть категорию, основанную на Id с родителями Категории со всеми изображениями, за исключением изображений, помеченных как IsDeleted = true

возможно ли это сделать в LINQ или LinqKit

+0

вы пробовали что-нибудь еще? – DavidG

+0

Да, я пробовал 'Linq' и' LinqKit', но я не мог отфильтровать изображения. Я думаю, что будет проще просто создать «хранимый прокумер» в SQL Server. – Moes

ответ

2

Это даст вам всю необходимую информацию с примененным фильтром. Единственная «комплекс» часть где положение применяется к свойству изображения (и я также добавил проверку нулевой в противном случае вы можете получить NullReferenceException):

var categoryID = 2; //The ID you are searching for 

var category = from c in categories 
       where c.Id == categoryID 
       select new Category 
       { 
        Id = c.Id, 
        Name = c.Name, 
        ParentId = c.ParentId, 
        IsDeleted = c.IsDeleted, 
        Timestamp = c.Timestamp, 
        Parent = c.Parent, 
        Images = c.Images == null ? 
         (ICollection<Image>)new List<Image>() : 
         (ICollection<Image>)c.Images.Where(i => i.IsDeleted = false).ToList() 
       }.Single(); 

Если вы хотите вернуть все родительские категории (т.е. Траверса иерархия), то один способ иметь такую ​​функцию:

public IEnumerable<Category> GetParents(IEnumerable<Category> categories, Category child) 
{ 
    List<Category> parents = new List<Category>(); 
    var current = child.Parent; 
    while (current != null) 
    { 
     parents.Add(parent); 
     parent = parent.Parent; 
    } 

    return parents; 

} 

Теперь вы можете сказать:

category.Parents = GetParents(categories, category); 
+0

Спасибо, Дэвид, который будет работать только на первом уровне, я хочу он также фильтрует все патенты – Moes

+0

И работает ли он сейчас? – DavidG

+0

нет, он не сделал то, что я хочу. спасибо за вашу помощь в любом случае – Moes

Смежные вопросы