Linq 联合条件查询快捷方法

时间:2023-02-27 08:05:31

原方法:

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);
}
}

Linq 联合条件查询快捷方法的更多相关文章

  1. Mybatis-技术专区-Criteria的and和or进行联合条件查询

    之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可以一直不知道怎么用,到今天才开始知道怎么简单的用.在我们前台查询的时候会有许多的 ...

  2. linq 多条件查询

    Linq 进行多条件查询的时候使用PredicateBuilder帮助类可以很好的解决. 类的源码: public static class PredicateBuilder { /// <su ...

  3. Linq in条件查询

    Linq 实现sql中的not in和in条件查询   T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products Wh ...

  4. &lbrack;C&num;&rsqb; Linq 动态条件查询

    应用背景:以货品为例,在基础数据中配置货品的判断规则,要根据这个规则筛选出符合条件的集合. 创建货品类 public class Product { public string Name { get; ...

  5. EntityFramework linq 多条件查询,不定条件查询

    一.场景描述: 开发的时候,有些查询功能,往往查询的条件是不确定的,用户没有填的不参与到查询中去. 如图1所示,用户可能只要给根据名称来查询即可,有时候开始时间和结束时间并不需要填写. 图 1 二.解 ...

  6. linq 多条件查询 where 拼接&plus;分页

    首先定义一个静态类 public static class QueryAssembly { /// <summary> /// 返回true /// </summary> // ...

  7. qt sql多重条件查询简便方法

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7457312.html 程序设计过程中,经常要涉及到查询,并且有很多条件,且条件可为空,如果逐个判断,会有很多情 ...

  8. linq自定义条件Lambda过滤方法

    Public Func<NoramalClass,bool>simpleComare<NormalClass>(string property,object value) { ...

  9. 转 --简单解决Linq多条件组合问题

    本文笔者用清晰的实例,解决了Linq多条件问题,思路十分的清晰,笔者也很细心的做了描述,希望能给你带来帮助. 最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆Linq,所以很多东西都要从存储过程 ...

随机推荐

  1. 【原创】自己动手写控件----XSmartNote控件

    一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...

  2. Java基本数据类型总结

    基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型.java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. 1. Java ...

  3. js Function&period;call

      提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments ...

  4. mysql集群之MYSQL CLUSTER

    1. 参考文档 http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%9 ...

  5. Android Studio稍微较新的版本下载

    ALL ANDROID STUDIO PACKAGES-V1.4.1.2422023 Select a specific Android Studio package for your platfor ...

  6. Android性能优化典范【转】

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...

  7. 快速构建Windows 8风格应用37-常见发布注意事项

    原文:快速构建Windows 8风格应用37-常见发布注意事项 引言 通常我们发布Windows Store应用失败后,会返回一些错误需要我们去修改.我之前在给学生做培训的时候发现大部分同学应用被打回 ...

  8. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165316

    2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 20165316 下载 我分别下载了kali-linux-2019.1-i386的镜像文件和kali-linux ...

  9. 转载:C&plus;&plus; 二维数组new

    来源:http://developer.51cto.com/art/201002/183127.htm C++编程语言中有一种叫做new的二维数组,它的应用方式比较灵活,可以有多种方法来帮助我们实现一 ...

  10. Python学习笔记&lpar;二&rpar;

    标识符和关键字 1,邮箱的Python标识符是任意长度的非空字符序列(引导字符+后续字符.) python标识符必须符合两条规则--标识符区分大小写 (1)只要是unicode编码字母都可以充当引导字 ...