C# 基于bools构建LINQ查询

C# 基于bools构建LINQ查询,c#,.net,linq,C#,.net,Linq,(这个问题的标题不是最好的,但我不知道该怎么说!) 我正在做一个包含价值清单的搜索表单。基本上,选中项表示“在搜索中包含此类型”。大概是这样的: Search for item: __________ Search in: [ ] Fresh Foods [ ] Frozen Foods [ ] Beverages [ ] Deli Counter public IList<FoodItem> FindFoodItems(FoodSe

(这个问题的标题不是最好的,但我不知道该怎么说!)

我正在做一个包含价值清单的搜索表单。基本上,选中项表示“在搜索中包含此类型”。大概是这样的:

Search for item: __________
Search in:
      [ ] Fresh Foods
      [ ] Frozen Foods
      [ ] Beverages
      [ ] Deli Counter
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;
}
我有一个对象来表示此搜索:

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;}
}
我能想到的唯一办法是这样做:

Search for item: __________
Search in:
      [ ] Fresh Foods
      [ ] Frozen Foods
      [ ] Beverages
      [ ] Deli Counter
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;
}
公共IList FindFoodItems(FoodSearchCriteria)
//实际上,这是一种模糊搜索,而不是精确匹配
var matches=_DB.FoodItems.Where(x=>x.FoodTitle==SearchString);
var inCategories=新列表();
如果(标准.新鲜食品)
inccategories.Add(matches.Where(x=>x.Type==‘新鲜食品’);
if(标准:SearchFrozenFoods)
inccategories.Add(matches.Where(x=>x.Type==‘冷冻食品’);
//等等
返回类别;
}
对我来说,这就像是一种代码味道,有什么更好的方法来处理它呢?

看看

PredicateBuilder predicate=PredicateBuilder.False();
如果(标准.新鲜食品)
{
谓词=谓词。或(x=>x.Type==“新鲜食品”);
}
if(标准:SearchFrozenFoods)
{
谓词=谓词。或(x=>x.Type==“冷冻食品”);
}
...
_DB.FoodItems.Where(谓词);
看一看

PredicateBuilder predicate=PredicateBuilder.False();
如果(标准.新鲜食品)
{
谓词=谓词。或(x=>x.Type==“新鲜食品”);
}
if(标准:SearchFrozenFoods)
{
谓词=谓词。或(x=>x.Type==“冷冻食品”);
}
...
_DB.FoodItems.Where(谓词);
您是否尝试过:

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));
列表类型=新列表();
if(criteria.SearchFreshFoods){types.Add(“新鲜食品”);}
if(criteria.SearchFrozenFoods){types.Add(“冷冻食品”);}
if(criteria.SearchBeverages){types.Add(“Beverages”);}
if(criteria.SearchDeliCounter){types.Add(“Deli计数器”);}
返回_DB.FoodItems.Where(x=>x.FoodTitle==SearchString&&
包含(x.Type));
这意味着只有一个SQL查询,这很方便

您当然可以重构FoodSearchCriteria类型,使其更易于构建列表,不过……

您是否尝试过:

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));
列表类型=新列表();
if(criteria.SearchFreshFoods){types.Add(“新鲜食品”);}
if(criteria.SearchFrozenFoods){types.Add(“冷冻食品”);}
if(criteria.SearchBeverages){types.Add(“Beverages”);}
if(criteria.SearchDeliCounter){types.Add(“Deli计数器”);}
返回_DB.FoodItems.Where(x=>x.FoodTitle==SearchString&&
包含(x.Type));
这意味着只有一个SQL查询,这很方便


您当然可以重构FoodSearchCriteria类型,以使构建列表更容易…

我没有时间回顾,但这可能是一个未经测试的解决方案

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;
}
类搜索项
{
字符串名称{get;set;}
布尔被选为{get;set;}
}
食品类搜索标准
{
字符串搜索文本{get;set;}
IList SearchItems{get;}
}
公共IList FindFoodItems(食品搜索标准)
//实际上,这是一种模糊搜索,而不是精确匹配
var matches=_DB.FoodItems.Where(x=>x.FoodTitle==criteria.SearchText&&
其中(si=>si.IsSelected).包含(i=>i.Name==x.Type));
返回数学;
}

我没有时间回顾,但这可能是一个未经测试的解决方案

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;
}
类搜索项
{
字符串名称{get;set;}
布尔被选为{get;set;}
}
食品类搜索标准
{
字符串搜索文本{get;set;}
IList SearchItems{get;}
}
公共IList FindFoodItems(食品搜索标准)
//实际上,这是一种模糊搜索,而不是精确匹配
var matches=_DB.FoodItems.Where(x=>x.FoodTitle==criteria.SearchText&&
其中(si=>si.IsSelected).包含(i=>i.Name==x.Type));
返回数学;
}

看起来不灵活。pb==谓词?看起来不完整。pb==谓词?请随意详细说明您心目中的重构:)现在还不确定。。。但至少,将构建列表的代码放到该类中是有意义的。请随意详细说明您想要的重构:)不确定。。。但至少将构建列表的代码放入该类中是有意义的。