背景
今天用EF写东西,觉得IEnumerable里面写where()条件老是写if判断很麻烦,
这样:
if (!string.IsNullOrWhiteSpace(key)) { list = list.Where(u => u.Name.Contains(key)).ToList(); } if (!string.IsNullOrWhiteSpace(key)) { list = list.Where(u => u.Name.Contains(key)).ToList(); } ..........
是不是能想点其他办法。
解决办法
我似乎知道该怎么做了。现在要实现一个功能,就是要把一个IQueryable<T> ,
如果condition指定的条件成立便执行predicate子句。
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; namespace WebApplication47 { public static class CollectionsExtensions { // // 摘要: // 如果condition指定的条件成立便执行predicate子句。 // // 参数: // source: // // predicate: // // condition: // // 类型参数: // T: public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, Expression<Func<T, bool>> predicate, bool condition) { if (condition) { source = source.Where(predicate); } return source; } // // 摘要: // 如果condition指定的条件成立便执行predicate子句。 // // 参数: // source: // // predicate: // // condition: // // 类型参数: // T: public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source, Func<T, bool> predicate, bool condition) { if (condition) { source = source.Where(predicate); } return source; } } }
测试效果
然后试着用EF读取数据库
public IActionResult Index() { List<Reptiles1688ImageSearch> list = new List<Reptiles1688ImageSearch>(); list.Add(new Reptiles1688ImageSearch() { Name = "test" }); string key = ""; //if (!string.IsNullOrWhiteSpace(key)) //{ // list = list.Where(u => u.Name.Contains(key)).ToList(); //} //if (!string.IsNullOrWhiteSpace(key)) //{ // list = list.Where(u => u.Name.Contains(key)).ToList(); //} //.......... var data = list.WhereIf(u => u.Name.Contains(key), !string.IsNullOrWhiteSpace(key)).ToList(); return View(); }
至此,达到预期效果。