C#进阶系列——动态Lamada(二:优化)
前言:前几天写了一篇动态Lamada的文章C#进阶系列——动态Lamada,受园友xiao99的启发,今天打算来重新优化下这个动态Lamada的工具类。在此做个笔记,以免以后忘了。
一、原理分析
上篇里面我们说了动态Lamada的使用必要性以及使用场景,但是感觉用在项目里面还不太方便,最难用的就是需要传递属性名称的字符串,感觉这有点太lower了。然后就是那个枚举的使用着实感觉没啥必要,我们只需要将Contains、Equal、LessThan、GreaterThan等方法分别封装一个独立的方法即可。好了,多说容易让人头晕,直接上代码吧。
二、代码示例
public class LamadaExtention<Dto> where Dto:new ()
{
private List<Expression> m_lstExpression = null;
private ParameterExpression m_Parameter = null; public LamadaExtention()
{
m_lstExpression = new List<Expression>();
m_Parameter = Expression.Parameter(typeof(Dto), "x");
}
//只读属性,返回生成的Lamada
public Expression<Func<Dto, bool>> Lamada
{
get
{
return GetLambda();
}
} /// <summary>
/// 字符串Contains筛选
/// </summary>
/// <param name="expProperty"></param>
/// <param name="strValue"></param>
public void Contains(Expression<Func<Dto, string>> expProperty, object strValue)
{
Expression expRes = Expression.Call(expProperty.Body, typeof(string).GetMethod("Contains"),
Expression.Constant(strValue));
m_lstExpression.Add(expRes);
} /// <summary>
/// 等于
/// </summary>
/// <param name="expProperty"></param>
/// <param name="strValue"></param>
public void Equal(Expression<Func<Dto, object>> expProperty, object strValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.Equal(member, Expression.Constant(strValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 小于
/// </summary>
/// <param name="expProperty"></param>
/// <param name="strValue"></param>
public void LessThan(Expression<Func<Dto, object>> expProperty, object strValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.LessThan(member, Expression.Constant( strValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 小于等于
/// </summary>
/// <param name="expProperty"></param>
/// <param name="strValue"></param>
public void LessThanOrEqual(Expression<Func<Dto, object>> expProperty, object strValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.LessThanOrEqual(member, Expression.Constant(strValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 大于
/// </summary>
/// <param name="expProperty"></param>
/// <param name="strValue"></param>
public void GreaterThan(Expression<Func<Dto, object>> expProperty, object strValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.GreaterThan(member, Expression.Constant(strValue, member.Type));
m_lstExpression.Add(expRes);
} /// <summary>
/// 大于等于
/// </summary>
/// <param name="expProperty"></param>
/// <param name="strValue"></param>
public void GreaterThanOrEqual(Expression<Func<Dto, object>> expProperty, object strValue)
{
var member = GetMemberExpression(expProperty);
Expression expRes = Expression.GreaterThanOrEqual(member, Expression.Constant(strValue, member.Type));
m_lstExpression.Add(expRes);
}private Expression<Func<Dto, bool>> GetLambda()
{
Expression whereExpr = null;
foreach (var expr in this.m_lstExpression)
{
if (whereExpr == null) whereExpr = expr;
else whereExpr = Expression.And(whereExpr, expr);
}
if (whereExpr == null)
return null;
return Expression.Lambda<Func<Dto, Boolean>>(whereExpr, m_Parameter);
} //得到MemberExpression
private MemberExpression GetMemberExpression(Expression<Func<Dto, object>> exp)
{
var arrSplit = exp.Body.ToString().Split("(.)".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var strProperty = arrSplit[arrSplit.Length - ];
MemberExpression member = Expression.PropertyOrField(m_Parameter, strProperty);
return member;
}
}
可以看出,对于常用的操作我们封装了Contains、Equal、LessThan、LessThanOrEqual、GreaterThan、GreaterThanOrEqual六个方法,除了Contains方法的参数直接使用了Expression<Func<DTO, string>>类型以为,其他都用的Expression<Func<DTO, object>>。因为Contains方法只可能是string类型的变量操作,而其他操作可能涉及其他类型,就是为了传这个object类型,有个问题博主调试了很久,由于传过来的是object,这个要得到属性的真是类型貌似不那么容易了,找了很久都没找到。最后只能通过GetMemberExpression这个方法来得到MemberExpression。
还是来看看如何使用:
public object GetUsers(int limit, int offset, string username, string fullname)
{
var oLamadaExtention = new LamadaExtention<DTO_TR_SYS_USERS>();
oLamadaExtention.Equal(x => x.USER_NAME, username);
oLamadaExtention.LessThan(x => x.MODIFYTIME, DateTime.Now);
var lstRes = UserManager.Find(oLamadaExtention.lamada).ToList();
}
最大的方便就是我们想要筛选的字段可以通过lamada点出来了,再看看之前的那种用法
oLamadaExtention.GetExpression("USER_NAME", username, ExpressionType.Contains);
有没有瞬间高大上。USER_NAME直接点出来,比敲字符串要爽吧。感谢神奇的Lamada,感谢全能的C#,感谢热心的园友。
C#进阶系列——动态Lamada(二:优化)的更多相关文章
- 【转载】C#进阶系列——动态Lamada(二:优化)
前言:前几天写了一篇动态Lamada的文章C#进阶系列——动态Lamada,受园友xiao99的启发,今天打算来重新优化下这个动态Lamada的工具类.在此做个笔记,以免以后忘了. 一.原理分析 上篇 ...
- C#进阶系列——动态Lamada
前言:在DDD系列文章里面,我们在后台仓储里面封装了传递Lamada表达式的通用方法,类似这样: public virtual IQueryable<TEntity> Find(Expre ...
- 【转载】C#进阶系列——动态Lamada
前言:在DDD系列文章里面,我们在后台仓储里面封装了传递Lamada表达式的通用方法,类似这样: public virtual IQueryable<TEntity> Find(Expre ...
- WCF 4.0 进阶系列 -- 随笔汇总
WCF4.0 进阶系列–前言 WCF4.0 进阶系列--第一章 WCF简介 WCF4.0进阶系列--第二章 寄宿WCF服务 WCF4.0进阶系列--第三章 构建健壮的程序和服务 WCF4.0进阶系列- ...
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
- C#进阶系列——MEF实现设计上的“松耦合”(二)
前言:前篇 C#进阶系列——MEF实现设计上的“松耦合”(一) 介绍了下MEF的基础用法,让我们对MEF有了一个抽象的认识.当然MEF的用法可能不限于此,比如MEF的目录服务.目录筛选.重组部件等高级 ...
- C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- Wireshark入门与进阶系列(二)
摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...
- Bing Maps进阶系列二:使用GeocodeService进行地理位置检索
Bing Maps进阶系列二:使用GeocodeService进行地理位置检索 在<Bing Maps进阶系列一:初识Bing Maps地图服务>里已经对GeocodeService的功能 ...
随机推荐
- SharePoint 2013 Designer系列之数据视图
在SharePoint使用中,数据展示是一块很重要的部分,很多时候我们会采用webpart的形式,但是有一些情况,我们不必使用开发,仅需使用Designer即可,下面让我简单介绍下数据视图的使用. 1 ...
- Apache日志按天切割
Linux系统配置方法: 将其改为 ErrorLog "| /usr/local/apache/bin/rotatelogs /home/logs/www/error_%Y%m%d.log ...
- Android开发学习——基础学习
在微信公众号上,发现一个自学android的一个文章,觉得不错.对其进行小小总结,整理给大家. 1. 基础UI学习 Button/TextView/EditText/CheckBox/ImageVie ...
- iOS中的交换空间(swap space)
看来是没有交换空间,原因是闪存和SSD硬盘相比,速度很慢,也有电源管理的原因. the NAND flash is not designed to be used as swap. It is dam ...
- (二)Maven的安装与环境配置
想要安装 Apache Maven在Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量. 所需工具 : 1.JDK 2.Ma ...
- String.SubString
1理论 String.SubString(int index,int length) index:开始位置,从0开始 length:你要取的子字符串的长度 2实验 string my = &quo ...
- Linux system log avahi-daemon[3733]: Invalid query packet
在检查Linux的日志文件时,发现大量 avahi-daemon[3733]: Invalid query packet错误(不同服务器对应的数字有所不同) Aug 3 07:00:01 hostn ...
- SQL性能优化:如何定位网络性能问题
一同事跟我反馈他遇到了一个SQL性能问题,他说全表只有69条记录,客户端执行耗费了两分多钟,这不科学呀.要我分析一下原因并解决.我按照类似表结构,构造了一个案例,测试截图如下所示 这个表有13800K ...
- Tomcat部署web项目
在Myeclipse中,我们很容易做到这一步:把一个web项目生成war文件 其实在eclipse中,实现这样的功能,也是很简单的. 下面就看一下是怎样操作的吧! 新建一个web项目: 取名为:ecl ...
- 魔改——MFC SDI 支持 内嵌 EXCEL OLE
==================================声明================================== 本文版权归作者所有 未经作者授权 请勿转载 保留法律追究的 ...