背景
今天用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();
}
至此,达到预期效果。