一Where 扩展的不足
如下界面可通过姓名编号和地址对人员进行模糊查询
我们通常会写出如下代码
public IQueryable<Person> Query(IQueryable<Person> source string name string code string address)
{
var result = source;
if(stringIsNullOrEmpty(name) == false)
result = sourceWhere(p => pNameContains(name))
if (stringIsNullOrEmpty(code) == false)
result = sourceWhere(p => pCodeContains(code))
if (stringIsNullOrEmpty(address) == false)
result = sourceWhere(p => pCodeContains(address))
return result;
}
以上代码有大量的 if 显得很繁琐代码可读性不好
二创建并使用 WhereIf 扩展
WhereIf 扩展比较简单代码如下
public static IQueryable<T> WhereIf<T>(this IQueryable<T> source Expression<Func<T bool》 predicate bool condition)
{
return condition ? sourceWhere(predicate) : source;
}
上面的代码可简化成
public IQueryable<Person> Query(IQueryable<Person> source string name string code string address)
{
return source
WhereIf(p => pNameContains(name) stringIsNullOrEmpty(name) == false)
WhereIf(p => pCodeContains(code) stringIsNullOrEmpty(code) == false)
WhereIf(p => pCodeContains(address) stringIsNullOrEmpty(address) == false)
}
是不是更易读一些!
当然我们还需要一个 IEnumerable<T> 版本的 WhereIf 扩展方便对集合进行查询
public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source Func<T bool> predicate bool condition)
{
return condition ? sourceWhere(predicate) : source;
}
三WhereIf 完整代码
namespace SystemLinq
{
public static class WhereIfExtension
{
public static IQueryable<T> WhereIf<T>(this IQueryable<T> source Expression<Func<T bool》 predicate bool condition)
{
return condition ? sourceWhere(predicate) : source;
}
public static IQueryable<T> WhereIf<T>(this IQueryable<T> source Expression<Func<T int bool》 predicate bool condition)
{
return condition ? sourceWhere(predicate) : source;
}
public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source Func<T bool> predicate bool condition)
{
return condition ? sourceWhere(predicate) : source;
}
public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source Func<T int bool> predicate bool condition)
{
return condition ? sourceWhere(predicate) : source;
}
}
}
将类放入 SystemLinq 命名空间中随时使用更方便