表达式树是否可以有个集合,条件过滤有了新方向
对于我之前项目中的统一条件过滤采用了dictinary来实现的,优点就是方法签名统一了,缺点不用说,就是字典的键容易写错,感觉一进入.net3.5之后,一切都要和Expression联系在一起,我们在创建一个Expression(表达式树)时,可以使用lambda表达式去创建,很容易:
1 Expression<Func< string , bool >> predicate= name=>name== " zzl " ;
可以看到,它其它由一个委托组成,输入参数是个字符,输出是个布尔值,在LINQ中这种技术被广泛的使用在扩展方法中,如Where扩展方法:
1 public static IQueryable<TSource> Where<TSource>( this IQueryable<TSource> source, Expression<Func<TSource, bool >> predicate)
2 {
3 if (source == null )
4 {
5 throw System.Linq.Error.ArgumentNull( " source " );
6 }
7 if (predicate == null )
8 {
9 throw System.Linq.Error.ArgumentNull( " predicate " );
10 }
11 return source.Provider.CreateQuery<TSource>(Expression.Call( null , ((MethodInfo) MethodBase.GetCurrentMethod()).MakeGenericMethod( new Type[] { typeof (TSource) }), new Expression[] { source.Expression, Expression.Quote(predicate) }));
12 }
无可厚非,表达式树的出现,lambda表达式的支持,是.net开发人员的福音,也是.net3.5中更大的亮点了。
说正文了,以前我的写统一的参数签名时,使用的是dictionary,代码中可以是这样的
1 Common.VPredication vp = new Common.VPredication(); 2 Common.PagingParam pp = new Common.PagingParam(page ?? 1 , VConfig.WebConstConfig.PageSize); 3 4 vp.AddItem( " userId " , userID); 5 if (_gid != 0 ) 6 vp.AddItem( " gid " , _gid);
统一的方法签名:
1 Common.Page.PagedList<Entity.Res_Item> GetList(Common.VPredication vp, Common.PagingParam pp)
而有了表达式树的集合后,完成可以把过滤条件写在它里面,这样构建条件变成了这样:
1 PredicateList<UserBases> zzl = new PredicateList<UserBases> (); 2 zzl.Add(i => i.Name.Contains( " zzl " )); 3 zzl.Add(i => i.UserID == 1 ); 4 GetModel(zzl).ForEach(i => Console.WriteLine(i.UserID + i.Name));
而方法签名仍然是很统一,只是变成了表达式树的样子,有点强类型的味道,呵呵:
1 List<UserBases> GetModel(PredicateList<UserBases> param)
而PredicateList类型的原代码,我也公开一下吧,呵呵,大家一共分享:
1 /// <summary>
2 /// 功能:条件过滤类
3 /// 作者:张占岭
4 /// 日期:2012-6-7
5 /// </summary>
6 public class PredicateList<TEntity> : IEnumerable<Expression<Func<TEntity, bool >>> where TEntity : class
7 {
8 List<Expression<Func<TEntity, bool >>> expressionList;
9 public PredicateList()
10 {
11 expressionList = new List<Expression<Func<TEntity, bool >>> ();
12 }
13 /// <summary>
14 /// 添加到集合
15 /// </summary>
16 /// <param name="predicate"></param>
17 public void Add(Expression<Func<TEntity, bool >> predicate)
18 {
19 expressionList.Add(predicate);
20 }
21 /// <summary>
22 /// 从集合中移除
23 /// </summary>
24 /// <param name="predicate"></param>
25 public void Remove(Expression<Func<TEntity, bool >> predicate)
26 {
27 expressionList.Remove(predicate);
28 }
29 #region IEnumerable 成员
30
31 public IEnumerator GetEnumerator()
32 {
33 return expressionList.GetEnumerator();
34 }
35
36 #endregion
37
38 #region IEnumerable<Expression<Func<TEntity>>> 成员
39
40 IEnumerator<Expression<Func<TEntity, bool >>> IEnumerable<Expression<Func<TEntity, bool >>> .GetEnumerator()
41 {
42 return expressionList.GetEnumerator();
43 }
44
45 #endregion
46 }
分类: ASP.NET , C#
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于表达式树是否可以有个集合,条件过滤有了新方向的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did48858