2009-07-17 3 views
1

(Der Titel für diese Frage ist nicht die beste, aber ich bin nicht sicher, wie sonst zu Wort, um es!)eine LINQ-Abfrage auf bools basierend Aufbau

ich auf einem Suchformular gerade arbeite, die eine enthält Checkliste der Werte. Grundsätzlich bedeutet ein überprüfter Artikel "Diesen Typ in die Suche einbeziehen". Etwas wie folgt aus:

Search for item: __________ 
Search in: 
     [ ] Fresh Foods 
     [ ] Frozen Foods 
     [ ] Beverages 
     [ ] Deli Counter 

Ich habe ein Objekt diese Suche darzustellen:

class FoodSearchCriteria{ 
    public string SearchString {get;set;} 
    public bool SearchFreshFoods {get;set;} 
    public bool SearchFrozenFoods {get;set;} 
    public bool SearchBeverages {get;set;} 
    public bool SearchDeliCounter {get;set;} 
} 

Der einzige Weg, ich, dies zu tun atm denken kann, ist wie folgt:

public IList<FoodItem> FindFoodItems(FoodSearchCriteria criteria) 
// in reality, this is a fuzzy search not an exact match 
var matches = _DB.FoodItems.Where(x => x.FoodTitle == SearchString); 

var inCategories = new List<FoodItem>(); 

if (criteria.SearchFreshFoods) 
    inCategories.Add(matches.Where(x => x.Type == 'Fresh Foods')); 
if (criteria.SearchFrozenFoods) 
    inCategories.Add(matches.Where(x => x.Type == 'Frozen Foods')); 
//etc etc 

return inCategories; 
} 

Das fühlt sich Wie ein Code-Geruch für mich, was wäre ein besserer Weg, um es zu nähern?

Antwort

3

Haben Sie versucht:

List<string> types = new List<string>(); 

if (criteria.SearchFreshFoods) { types.Add("Fresh Foods"); } 
if (criteria.SearchFrozenFoods) { types.Add("Frozen Foods"); } 
if (criteria.SearchBeverages) { types.Add("Beverages"); } 
if (criteria.SearchDeliCounter) { types.Add("Deli Counter"); } 

return _DB.FoodItems.Where(x => x.FoodTitle == SearchString && 
           types.Contains(x.Type)); 

, dass nur eine SQL-Abfrage bedeutet, was sehr praktisch ist.

Sie könnten sicherlich die FoodSearchCriteria Typ Refactoring, um es einfacher die Liste allerdings zu bauen ...

+0

Fühlen Sie sich frei, was Refactoring Sie im Hinterkopf haben :) – Kirschstein

+0

Nicht sicher, off-hand ... aber zumindest wäre es sinnvoll, den Code zu setzen, um die Liste * in * dieser Klasse zu bauen. –

5

Werfen Sie einen Blick auf PredicateBuilder

PredicateBuilder predicate = PredicateBuilder.False<FoodItem>(); 
if (criteria.SearchFreshFoods) 
{ 
    predicate = predicate.Or(x => x.Type == 'Fresh Foods'); 
} 
if (criteria.SearchFrozenFoods) 
{ 
    predicate = predicate.Or(x => x.Type == 'Frozen Foods')); 
} 
... 

_DB.FoodItems.Where(predicate); 
+0

Sieht unvollständig. pb == Prädikat? – Dykam

+0

Ja. Entschuldigung, jetzt behoben. –

0

Ich habe keine Zeit zu überprüfen, aber dies könnte eine nicht getestete Lösung sein.

class SearchItem 
{ 
    string Name {get; set;} 
    bool IsSelected {get; set;} 
} 

class FoodSearchCriteria 
{ 
    String searchText {get; set;} 
    IList<SearchItem> SearchItems{ get; } 
} 

public IList<FoodItem> FindFoodItems(FoodSearchCriteria criteria) 
// in reality, this is a fuzzy search not an exact match 
var matches = _DB.FoodItems.Where(x => x.FoodTitle == criteria.SearchText && 
             criteria.SearchItems.Where(si => si.IsSelected).Contains(i => i.Name == x.Type)); 

return mathces; 
} 
Verwandte Themen