2016-06-30 12 views
1

ベンダーモデルの会社名を使用する検索から一連のベンダーエンティティを返し、カテゴリモデルのカテゴリ名をパラメーター。クライアントは、検索パラメータを使用するか、または両方を同時に使用するかを選択できます。私が何をしたいか多対多リレーションシップを持つ2つのMVCモデルのパラメータを使用して検索

はベンダー会社財産に対するベンダーのモデルを検索して、カテゴリー区分名プロパティに対して再び検索した結果である一覧<ベンダー>に設定されています。

ベンダーモデルとカテゴリモデルには、多対多の関係があります。

これらはモデルです:

public class public class Vendor 
{ 
    public int ID { get; set; } 

    [Required] 
    public string Company { get; set; }  
    ... 
    [Required] 
    public virtual ICollection<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public int CategoryID { get; set; } 

    [Required] 
    public string CategoryName { get; set; } 

    public virtual ICollection<Vendor> Vendors { get; set; } 
} 

HTMLコードは次のとおりです。

@using (Html.BeginForm("Index", "Home", FormMethod.Get)) 
{  
<div class="row"> 
    <div class="col-md-10"> 
     Vendor Name: @Html.TextBox("Search") 
    </div> 
</div> 
    <div class="row"> 
     <div class="col-md-10"> 
      Vendor Category: @Html.DropDownList("VendorCategory", "All") 
     </div> 
    </div> 
    <div class="row"> 
     <div class="col-md-10"> 
      <input type="submit" value="Search" /> 
     </div> 
    </div> 
} 

検索を処理するコントローラメソッドの一部は次のとおりです。

public ActionResult Index(string Search, int? VendorCategory) 
{ 
    var vendors = from v in db.Vendors select v; 

    if(!string.IsNullOrEmpty(Search)) 
    { 
     vendors = vendors.Where(s => s.Company.Contains(Search)); 
    } 

    //Filter the remaining vendors based on the Vendor CategoryName returned from the dropdown list. 
    if(VendorCategory != null) 
    { 
     //Get the category ID of the Category name selected on the home page Vendor Category dropdown list. 
     int TheCategoryID = VendorCategory.GetValueOrDefault(); 

     vendors = ??? 
    }  
} 

私はよLINQクエリを作成してCategory nのCategoryIDを持つベンダのみを返す方法の最後のコード行に固執する私の文字列がドロップダウンリストから返されました。私はナビゲーションプロパティがカテゴリオブジェクトのセットを参照していることを知っています。問題のカテゴリIDを持つカテゴリオブジェクト参照を持つ残りのベンダをすべて取得するLINQクエリを書く方法がわかりません。

私はMVC/Entity Frameworkを使い慣れていないし、LINQ(TheCategory変数に結果を割り当てるクエリのカテゴリキャストについてはわからない)に関する広範な知識を持っていないので、これについてすべて間違っている。

答えて

0

VendorCategoryのコレクションを持っているので、あなたのVendorクエリは非常に簡単である必要があります。各Vendor vに対して

var vendors = Vendors.Where(v => v.Categories.Select(c => c.CategoryId) 
              .Contains(TheCategoryID)); 

、我々は、我々はその検索、すべてのIDを表しIEnumerable<int>からCategoriesリストを変換しますTheCategoryIDが存在するかどうかを確認してください。そうであれば、それは真を返し、Where節に含まれます。

+1

これは完全に機能しました。 ealierコードを見たことがある人には、ドロップダウンリスト(インデックスシグネチャとカテゴリIDの取得)を処理するためにコントローラコードを大幅に変更したので編集しましたが、DanielがLINQクエリを使用しました。上記のコントローラコードの最後の行。 – ETex

関連する問題