用于Lambda表达式之前先动态拼接查询条件
后续学习使用
添加 PredicateBuilder 类
public static class PredicateBuilder
{
/// <summary>
/// 机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> True<T>() { return f => true; }
/// <summary>
/// 机关函数应用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混应时写在OR后面的AND有效
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> False<T>() { return f => false; }
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
}
}
//使用方式 调用类PredicateBuilder
bool bo = true;
int a = 2;
int b = 1;
using (KnitwearManagementTableEntities kmt = new KnitwearManagementTableEntities())
{
var list = kmt.OrderEntry.ToList();
var where = PredicateBuilder.True<OrderEntry>();
if (bo)
{
//where = where.And(p => p..Contains("1"));
where = where.And(p =>p.ItemNo.Contains("001"));
}
if (a == 2)
{
where = where.And(p =>p.Uniques.Contains("14"));
}
if (b == 2)
{
where = where.And(p => p.ProductNumber.Contains("WC806-B"));
}
var result = kmt.OrderEntry.Where(where.Compile()).ToList();
var temp = result;
}
//附加去除重复的拓展函数
public static class distinctby
{
/// <summary>
/// 拓展方法去除重复数据 指定列
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="source"></param>
/// <param name="keySelector"></param>
/// <returns></returns>
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
}