基于bools构建LINQ查询

Kir*_*ein 1 .net c# linq

(这个问题的标题不是最好的,但我不确定如何说出来!)

我正在编写一个包含值列表的搜索表单.基本上,选中的项目意味着"在搜索中包含此类型".像这样的东西:

Search for item: __________
Search in:
      [ ] Fresh Foods
      [ ] Frozen Foods
      [ ] Beverages
      [ ] Deli Counter
Run Code Online (Sandbox Code Playgroud)

我有一个对象来代表这个搜索:

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;}
}
Run Code Online (Sandbox Code Playgroud)

我能想到做这个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;
}
Run Code Online (Sandbox Code Playgroud)

这对我来说就像是一种代码味道,接近它会有什么更好的方式?

Win*_*ith 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);
Run Code Online (Sandbox Code Playgroud)