我的WCF数据服务(三)胜利

这个问题解决起来还颇费了一些周章。在搜索解决方案的时候,发现了这篇文章:http://blog.csdn.net/heshengfen123/article/details/17301079
和我遇到了同样的问题。作者使用了 Dynamic Expression API 这个组件解决了问题,我也按照文章上说的下载了这个组件,放到了项目里,于是代码变成了这样:

int i = 3,rc;
var q = System.Linq.Dynamic.DynamicExpression.ParseLambda<XXX, bool>("id>@0", i);
var l = BLL.XXX.GetList(30,1,q,x=>x.id,true,out rc);

运行又可以了,但是当我需要按字符串查询的时候,又不行了,我本来要这样:

int rc;
string s = "中";
var l = BLL.XXX.GetList(30,1,x=>x.name.Contains(s),x=>x.id,true,out rc);
可是 System.Linq.Dynamic.DynamicExpression.ParseLambda<XXX, bool>("name.Contains(\" + s + "\""); 

这样会报错。
我不明白是怎么回事,于是研究起 Dynamic Expression API 这个组件的源代码,发现只实现了 = < > 等这样符号的运算。这样的话基本上在生产环境是没法用的。不过我在研究的过程中学到了不少 Expression 相关的知识,然后就想想有什么样的解决办法。我想,既然他们能动态的生成一个表达式,那我也能啊,我生成完再组合起来,也一样用啊。于是我照着他们的代码,自己写了一些建立表达式树的辅助方法。

public static Expression<Func<T, bool>> ToExpressionContainsMe<T>(this string s, Expression<Func<T, string>> keySelector)
        {
            MethodCallExpression met = Expression.Call(keySelector.Body, typeof(string).GetMethod("Contains"), Expression.Constant(s));
            Expression<Func<T, bool>> lamb = Expression.Lambda<Func<T, bool>>(met, keySelector.Parameters);
            return lamb;
        }

public static Expression<Func<T, bool>> ToExpressionEqual<T>(this int i, Expression<Func<T,int>> keySelector)
        {
            return Expression.Lambda<Func<T, bool>>(Expression.Equal(Expression.Constant(i), keySelector.Body), keySelector.Parameters);
        }

这里举两个例子,别的都是大同小异的。又从网上抄了段能 And Or 组合表达式的代码,我不放这了,请自己去搜。
于是代码成了这样:

int i=3,j=100,rc;
Expression<Func<Model.XXX,bool>> q = i.ToExpressionGreaterThanMe(x=>x.id);
q = q.And(j.ToExpressionLessThanMe(x=>x.id));
string s = "中";
q = q.And(s.ToExpressionContainsMe(x=>x.name));
var l = BLL.XXX.GetList(30,1,q,x=>x.id,true,out rc);

这样就成功了,完全可以用到生产环境了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值