2009-04-22 7 views
0

Was ich versuche, ist eine generische Suchfunktion für eine Tabelle bereitzustellen. Dem Benutzer werden also alle Daten in einer Tabelle angezeigt, sie geben einen Text ein, nach dem gefiltert werden soll, und voila, die Tabelle wird nun nach allen Ergebnissen gefiltert, die mit diesem Eintrag übereinstimmen.ASP.NET MVC-Abfrage mit optionalem Feld und Wert

Ich habe dies mit einem einzigen Feld arbeiten:

public ActionResult Index(string user_name) 
{ 

    var dataContext = new PurchaseOrderDataContext(); 

    var orders = from o in dataContext.purchase_orders 
       where o.approved_by.display_name.StartsWith(user_name ?? "") 
       select o; 

    if (Request.IsAjaxRequest()) 
    { 
     return PartialView("list", orders); 
    } 
    else 
    { 
     return View(orders); 
    } 
} 

Aber was ich suche ist die Fähigkeit, für sie eine Dropdown-Liste, die sie auf dem Gebiet passieren lässt, dass sie auf filternde . Es wäre so etwas wie dies mag:

public ActionResult Index(string field, string query_value) 
{ 

    var dataContext = new PurchaseOrderDataContext(); 

    var orders = from o in dataContext.purchase_orders 
       where o["field"].StartsWith(query_value ?? "") 
       select o; 

    if (Request.IsAjaxRequest()) 
    { 
     return PartialView("list", orders); 
    } 
    else 
    { 
     return View(orders); 
    } 
} 

... Abgesehen davon, dass die o["field"] ist nur meine dumme Vermutung an Syntax (was nicht funktioniert).

Ich denke, ich bin nur verwirrt, weil ich manchmal, obwohl ich dieses nette klassifizierte Datenmodell verwende, explizit auf die Spalten mit Namen verweisen möchte.

Wie würde ich das machen?

Ich entschuldige mich, wenn dies offensichtlich ist ...

Edit: Ich glaube, ich jetzt diese offen lassen werde, um zu sehen, ob eine sauberere gibt es weniger hack-ish Gefühl Lösung als unten vorgeschlagen. Vielen Dank!

Antwort

2

Die einzige einfache (hängt von Ihrer Definition von "einfach" ich denke) Weg dies zu tun wäre, die Dynamic Linq API zu verwenden. Siehe hier:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+0

Ich landete hauptsächlich auf dieser Route ... Es stellte sich heraus, dass es ziemlich elegant und nützlich war.Ich habe eine separate Implementierung für jedes Modell, aber es ist wirklich nicht schlecht. Danke vielmals! –

1

So wie ich dies mit einer switch-Anweisung tun würde:

var orders = dataContext.purchase_orders; 

if(!string.IsNullOrEmpty(query_value)) 
{ 
    switch(field) 
    { 
     case "firstname": 
      orders = orders.Where(x => x.FirstName.StartsWith(query_value)); 
      return; 
     case "company": 
      orders = orders.Where(x => x.Company.StartsWith(query_value)); 
      return; 
     // etc. 
    } 
} 

Dies ermöglicht es Ihnen auch field zu validieren.

+0

So viel Arbeit ... :-) Ich bin faul. Ich habe auf eine wiederverwendbare Routine gehofft, weil ich genau auf diese Weise mit ziemlich vielen Tabellen zu tun habe und es hasse, Code zu wiederholen, der einen String einer gleichnamigen Datenspalte zuordnet. –

+0

Habe ich falsch gedacht, dass es ein paar jQuery-Plugins gibt, die diese Funktionalität auf der Client-Seite bieten? – Will

+0

Sie können die dynamische Linkabfrage verwenden, die von BFree erwähnt wird. – Keltex

1

Der Hauptgrund, warum Sie den Feldnamen nicht einfach als den Eigenschaftsnamen Ihrer Klasse eingeben können, ist, weil Linq einen Ausdrucksbaum erstellt.

Jetzt können Sie aufteilen, wie Sie Ihren Ausdrucksbaum erstellen, indem Sie tun.

var orders = from o in dataContext.purchase_orders 
       select o; 

if (!string.IsNullOrEmpty(user_name)) { 
    orders = orders.Where(x => x.StartsWith(user_name); 
} 

Und mehr hinzufügen, wenn Aussagen .... puh ... Ja, es ist definitiv nicht schön, und jemand kann es wahrscheinlich ein IDictionary < String, indem sie, viel besser aussehen Func < Expression, string> > statt einer Reihe von if-Anweisungen, aber es fühlt sich immer noch an wie ein Hack.

+0

Ich hatte gehofft, du würdest das nicht sagen ... Was für ein Schmerz. Trotzdem danke! –

+0

Sie wissen etwas, ich dachte ein bisschen darüber nach. Ich fand diesen Artikel http://msdn.microsoft.com/en-us/library/bb882637.aspx. Sagen Sie uns, wenn Sie etwas finden. – Min

+0

Danke - das kann eine Option sein. Ich probiere jetzt ein paar Sachen aus ... –

Verwandte Themen