2016-06-30 8 views
1

Ich versuche, eine Gruppe von Lieferantenentitäten aus einer Suche zurückzugeben, die einen Firmennamen aus dem Lieferantenmodell und einen Kategorienamen aus dem Kategorienmodell verwendet Parameter. Der Client könnte entweder den Suchparameter oder beide gleichzeitig verwenden.Suche mit Parametern aus zwei MVC-Modellen mit einer Viele-zu-viele-Beziehung

Was ich tun möchte, ist eine Liste <Vendor> einrichten, die ein Ergebnis der Suche im Vendors Modell gegen den Verkäufer Firma Eigenschaft ist und dann wieder die Suche gegen die Kategorie Kategorie Eigenschaft.

Die Hersteller- und Kategorie-Modelle haben eine Viele-zu-Viele-Beziehung.

Dies sind die Modelle:

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; } 
} 

Der HTML-Code ist:

@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> 
} 

Der Teil der Controller-Methode, die die Suche behandelt ist:

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 = ??? 
    }  
} 

Ich bin stecken in der letzten Codezeile, wie Sie eine LINQ-Abfrage erstellen, um nur die Anbieter zurückzugeben, die über die Kategorie-ID der Kategorie na verfügen Die Zeichenfolge me wurde von der Dropdown-Liste zurückgegeben. Ich weiß, dass die Navigationseigenschaft auf eine Gruppe von Category-Objekten verweist, und ich bin mir nicht sicher, wie eine LINQ-Abfrage geschrieben wird, die alle verbleibenden Anbieter mit einer Category-Objektverweis mit der fraglichen Category ID erhält.

Ich bin neu in MVC/Entity Framework, und habe keine umfassenden Kenntnisse von LINQ (nicht sicher über die Category Cast auf die Abfrage das Ergebnis der TheCategory-Variable zuweisen), so verstehe ich, dass ich gehen werde darüber alles falsch.

Antwort

0

Da die Vendor eine Sammlung von Category s hat, Ihre Vendor Abfrage sollte ganz einfach sein:

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

Für jede Vendor v wir die Categories Liste IEnumerable<int> transformieren, die alle IDs darstellt, dann suchen wir, dass für TheCategoryID um zu sehen, ob es da ist. Wenn dies der Fall ist, wird "wahr" zurückgegeben und in die Klausel Where aufgenommen.

+1

Das hat perfekt funktioniert. Ein Hinweis an diejenigen, die den besseren Code gesehen haben, habe ich bearbeitet, da ich den Controller-Code wesentlich geändert habe, um die Dropdownliste zu handhaben (Index-Signatur und Kategorie-ID), aber ich habe immer noch die von Daniel bereitgestellte LINQ-Abfrage verwendet die letzte Zeile im obigen Controller-Code. – ETex

Verwandte Themen