您的位置:首页 > 其它

Linq 联合查询条件快捷拼接方法

2017-07-04 18:56 375 查看
原方法:

public ProductDC[] GetProductQueryCondition(ProductQueryConditionDC filter)

{//红色为原来的联合条件(之后下面的修改过的方法是使用了,相关的条件联合方法)

var datas = Repository.LoadEntities<Product>(o => o.Status != (int)ProductStatus.Disabled
&& ((!string.IsNullOrEmpty(filter.ProductNo) && (o.ProductNo.Contains(filter.ProductNo)))
|| (!string.IsNullOrEmpty(filter.ProductName) && (o.ProductNo.Contains(filter.ProductName)))
|| ((filter.Category == (int)ProductCategory.All ? (new int?[] { (int)ProductCategory.FinishedProduct, (int)ProductCategory.SemiFinishedProduct }).Contains(o.Category) : o.Category == filter.Category))
|| ((filter.Status == (int)ProductStatus.All ? (new int?[] { (int)ProductStatus.Building, (int)ProductStatus.SignIn, (int)ProductStatus.TobeReleased, (int)ProductStatus.Released }).Contains(o.Status) : o.Status == filter.Status))
|| (!string.IsNullOrEmpty(filter.Customer) && (o.ProductNo.Contains(filter.Customer)))
|| ((filter.StartDate != null ? (filter.EndDate != null ? (o.MkDate > filter.StartDate && o.MkDate < filter.EndDate) : o.MkDate > filter.StartDate) : (filter.EndDate != null ? o.MkDate < filter.EndDate : o.MkDate == o.MkDate)))))

.Select(p => new ProductDC()

{

ProductId = p.ProductId,

ProductNo = p.ProductNo,

ProductName = p.ProductName,

Ver = p.Ver,

Spec = p.Spec,

Customer = p.Customer,

Category = p.Category,

CategoryName = p.Category == (int)ProductCategory.FinishedProduct ? "成品" : p.Category == (int)ProductCategory.SemiFinishedProduct ? "半成品" : "",

Status = p.Status,

StatusName = p.Status == (int)ProductStatus.Building ? "新建中" : p.Status == (int)ProductStatus.SignIn ? "会签中" : p.Status == (int)ProductStatus.TobeReleased ? "待发布" : p.Status == (int)ProductStatus.Released ? "已发布" : p.Status == (int)ProductStatus.Disabled ?
"已停用" : "",

Description = p.Description,

Other1 = p.Other1,

Other2 = p.Other2,

Other3 = p.Other3,

Other4 = p.Other4,

MkUserId = p.MkUserId,

MkDate = p.MkDate,

CountersignCode = p.CountersignCode,

Pubdate = p.Pubdate,

Stopdate = p.Stopdate

});

return datas.ToArray();}

 

方法:

public ProductDC[] GetProductQueryCondition(ProductQueryConditionDC filter)

{

var Predicate = PredicateBuilder.True<Product>();//PredicateBuilder是下面红色标记的条件联合类

Predicate = Predicate.And<Product>(x => x.Status != (int)ProductStatus.Disabled);

if (!string.IsNullOrWhiteSpace(filter.ProductNo))

{

Predicate = Predicate.And<Product>(x => x.ProductNo.Contains(filter.ProductNo));

}

if (!string.IsNullOrWhiteSpace(filter.ProductName))

{

Predicate = Predicate.And<Product>(x => x.ProductName.Contains(filter.ProductName));

}

if (filter.Category == (int)ProductCategory.All)

{

Predicate = Predicate.And<Product>(x => new int?[] { (int)ProductCategory.FinishedProduct, (int)ProductCategory.SemiFinishedProduct }.Contains(x.Category));

}

else

{

Predicate = Predicate.And<Product>(x => x.Category == filter.Category);

}

if (filter.Status == (int)ProductStatus.All)

{

Predicate = Predicate.And<Product>(x => new int?[] { (int)ProductStatus.Building, (int)ProductStatus.SignIn, (int)ProductStatus.TobeReleased, (int)ProductStatus.Released }.Contains(x.Status));

}

else

{

Predicate = Predicate.And<Product>(x => x.Status == filter.Status);

}

if (!string.IsNullOrWhiteSpace(filter.Customer))

{

Predicate = Predicate.And<Product>(x => x.Customer.Contains(filter.Customer));

}

if (filter.StartDate.HasValue)

{

Predicate = Predicate.And<Product>(x => x.MkDate > filter.StartDate.GetValueOrDefault());

}

if (filter.EndDate.HasValue)

{

Predicate = Predicate.And<Product>(x => x.MkDate < filter.EndDate.GetValueOrDefault());

}

 

var datas = Repository.LoadEntities<Product>(Predicate)

.Select(p => new ProductDC()

{

ProductId = p.ProductId,

ProductNo = p.ProductNo,

ProductName = p.ProductName,

Ver = p.Ver,

Spec = p.Spec,

Customer = p.Customer,

Category = p.Category,

CategoryName = p.Category == (int)ProductCategory.FinishedProduct ? "成品" : p.Category == (int)ProductCategory.SemiFinishedProduct ? "半成品" : "",

Status = p.Status,

StatusName = p.Status == (int)ProductStatus.Building ? "新建中" : p.Status == (int)ProductStatus.SignIn ? "会签中" : p.Status == (int)ProductStatus.TobeReleased ? "待发布" : p.Status == (int)ProductStatus.Released ? "已发布" : p.Status == (int)ProductStatus.Disabled ?
"已停用" : "",

Description = p.Description,

Other1 = p.Other1,

Other2 = p.Other2,

Other3 = p.Other3,

Other4 = p.Other4,

MkUserId = p.MkUserId,

MkDate = p.MkDate,

CountersignCode = p.CountersignCode,

Pubdate = p.Pubdate,

Stopdate = p.Stopdate

});

return datas.ToArray();

}

 

 

 

使用的条件联合的类

#region PredicateBuilder

public static class PredicateBuilder

{

/// <summary>

/// 机关函数应用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混应时写在OR后面的AND有效 

/// </summary>

/// <typeparam name="T"></typeparam>

/// <returns></returns>

public static Expression<Func<T, bool>> True<T>() { return f => true; }

/// <summary>

/// 机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效 

/// </summary>

/// <typeparam name="T"></typeparam>

/// <returns></returns>

public static Expression<Func<T, bool>> False<T>() { return f => false; }

public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)

{

// build parameter map (from parameters of second to parameters of first) 

var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);

// replace parameters in the second lambda expression with parameters from the first 

var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

// apply composition of lambda expression bodies to parameters from the first expression 

return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);

}

public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)

{

return first.Compose(second, Expression.And);

}

public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)

{

return first.Compose(second, Expression.Or);

}

}

public class ParameterRebinder : ExpressionVisitor

{

private readonly Dictionary<ParameterExpression, ParameterExpression> _map;

public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)

{

_map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();

}

public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)

{

return new ParameterRebinder(map).Visit(exp);

}

protected override Expression VisitParameter(ParameterExpression p)

{

ParameterExpression replacement;

if (_map.TryGetValue(p, out replacement))

{

p = replacement;

}

return base.VisitParameter(p);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: