2009-07-17 1 views
1

に基づいてLINQクエリを構築する(この質問のタイトルはベストではないですが、私はどのように他の単語、それまでわからないんだよ!)私が含まれている検索フォームに取り組んでいますはbools

値のチェックリスト。基本的には、チェック項目は「このタイプを検索に含める」という意味です。このような何か:

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

私はこのATMをやって考えることができる唯一の方法は、このようなものです::これは感じて

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

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

私は、この検索を表現するオブジェクトを持っていますコードの臭いのように、それに近づくためのよりよい方法は何でしょうか?

答えて

3

を見て、あなたは試してみました:

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

を便利であるだけで1つのSQLクエリを、意味します。

あなたは確かにそれが簡単にかかわらず、リストを作成できるようにすることFoodSearchCriteriaタイプをリファクタリングでき...

+0

あなたが心に持っているリファクタリングについて詳しく教えてください:) – Kirschstein

+0

あまりよく分かりませんが、少なくともリストに*そのクラスにビルドするコードを書くのは意味があります。 –

5

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

不完全そうです。 pb ==述語? – Dykam

+0

はい。謝罪、今修正されました。 –

0

私は検討する時間がないが、これは未テストソリューションである可能性があります。

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; 
} 
関連する問題