2017-02-20 2 views
1

我的數據庫由兩個模型組成:產品和類別。 類別模型本身由父類和子類組成,就像一個特定的「ParentID」字段相互關聯。 Parent to Children類別的關係是一對多關係。孩子可以是從零到'n'的任何數字。 與產品的關係類別(或子類別)是一對多關係,類別ID是產品表格中的FK。搜索產品,類別和子類別中的字符串

我開始寫作中產品的名稱和描述和類別名稱搜索:

IQueryable<Product> products = 
      from p in db.Products 
      where (p.Name.Contains(searchString) 
       || p.Description.Contains(searchString) 
       || p.Category.Name.Contains(searchString)) 
       select p; 

由於形式允許用戶從一個DDL特定的類別,如果類別已被選中,我需要現在我的查詢擴展到其子類別如下:

  1. 尋找搜索字符串的兒童類的名字太

  2. 個濾波結果對所屬類別和子類別只

  3. 添加新項目之前的結果

我怎麼到內兒童的類別名稱週期,以滿足點1.2.3,加入需要結果以前選擇?

添加機型(僅適用領域):

public partial class Product 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public int CategoryID { get; set; } 
} 

public partial class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int? ParentID { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

試圖更好地解釋它。鑑於:

  1. 搜索字符串(不搜索字符串返回的所有產品)
  2. 選定父類別(可選,沒有選擇返回所有類別)

我想去的地方檢索所有產品:

CASE 'A':選擇

  1. 產品的名稱的父類中包含搜索串
  2. 所有類別包含搜索字符串

CASE「B」:選擇

  1. 產品的名稱中包含關於選定父類以及搜索字符串(只有那些產品 父類的 如果有的話)
  2. 選定的父類別名稱包含搜索字符串
  3. 選擇父類別的子類別(i F所列)名稱中包含搜索字符串
+1

請問您可以添加定義'產品'和'類別'關係到您的問題的代碼? 'Product'和'Category'之間是否有一對一的關係?聽起來有點反直覺,一個'Category'只有一個'Product' ... – wkl

+1

你確實是對的。我編輯了關係,這是每個類別的許多產品。 – Luke

回答

0
IQueryable<Product> products = 
     from p in db.Products 
     where (p.Name.Contains(searchString) 
      || p.Description.Contains(searchString) 
      || p.Category.Name.Contains(searchString)) 
      select p; 

if (selectedCategoryID.HasValue) // filter category AND subcategories 
     { 
      List<int> categories = new List<int>(); 
      categories.Add(selectedCategoryID.Value); 
      foreach(Category child in GetCategories.activeChildrenCategories(db,selectedCategoryID.Value)) 
      { 
       categories.Add(child.ID); 
      } 

      products = products .Where(p => (categories.Contains(p.Category.ID))); 
+0

按要求工作。 – Luke

0

假設你的孩子的類別公開爲可枚舉的父類,可能叫做分類,那麼你的原始查詢可以延長使用Any()操作,例如他們搜索p.Category.Categories.Any(x => x.Name.Contains(searchString)),so:

var products = 
    from p in Products 
    where (p.Name.Contains(searchString) 
     || p.Description.Contains(searchString) 
     || p.Category.Name.Contains(searchString) 
     || p.Category.Categories.Any(x => x.Name.Contains(searchString)) 
    ) && p.IsDeleted == false && p.IsApproved == true 
    select p; 

您對父類別的過濾器可以繼續按原樣使用。

+0

反過來說:由於關係是多個產品到一個類別,因此它是展示IEnumerable產品的類別模型。不應該嗎? – Luke

+0

我正在考慮父類別與子(子)類別的關係。 – stovroz

+0

目前沒有關係,但父類別具有parentID空值,而子類別將其設置爲其父類別標識,但我想我可以爲此編寫合適的方法。 – Luke

相關問題