c# - 基于书籍构建 LINQ 查询

标签 c# .net linq

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

我正在处理包含值 list 的搜索表单。基本上,选中的项目意味着“在搜索中包含此类型”。像这样:

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

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

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

这对我来说感觉像是一种代码味道,有什么更好的方法来处理它?<​​/p>

最佳答案

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

关于c# - 基于书籍构建 LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1143726/

相关文章:

c# - 在 LinqToSql 中是否有更短的方法将属性解析为 Int(或任何其他原语)

linq - 如何在Linq查询中使用Union

c# - 如何为遗留代码编写测试然后重构它?

c# - 从位图转换为 JPEG 并保留原始位图分辨率

.net - 为什么.net 4.0和.net 2.0 CLR可以存在于同一台机器上

.net - 在 .net 中创建对列表

c# - 判断两个DateTimes之间的差异,只计算开放时间

c# - 在c#中映射一些数据

mysql - 如何使用 vb.net 防止 MySQL 数据库注入(inject)攻击?

c# - 使用 LINQ SQL 查明更新是否成功?