entity framework 6.0 复杂条件的两种调用方式



代码如下,某些类是自己写,可以不关注,只关注形成条件部分(方法1,方法2)

共同的部分


排序实体类 omf1 = new 排序实体类("字段a", true);//多个字段排序
排序实体类 omf2 = new 排序实体类("字段b", false);
采用方法1或者2
测试实体类 prexxgk = basebll.GetSingle<测试实体类>(condition, new List<排序实体类>() { omf1, omf2 });


形成的sql语句类似
Select * from a where 字段c=111 and 字段d=222 and ( (字段a>’2014-6-4’ and 字段b!=333) or (字段a==’2014-6-4’ and 字段b>333) )



方法1.


           Expression<Func<测试实体类, bool>> condition = c => (c.字段c == 某数据实体.字段c && c.字段d == 某数据实体.字段d &&
           ((c.字段a > 某数据实体.字段a && c.字段b != 某数据实体.字段b) || (c.字段a == 某数据实体.字段a && c.字段b > 某数据实体.字段b)));


方法2.(参考网址 http://www.albahari.com/nutshell/predicatebuilder.aspx



           var innerChild1= PredicateBuilder.True<测试实体类>();
           innerChild1 = innerChild1.And(p => p.字段a >某数据实体.字段a);
           innerChild1 = innerChild1.And(p => p.字段b != 某数据实体.字段b);

           var innerChild2 = PredicateBuilder.True<测试实体类>();
           innerChild2 = innerChild2.And(p => p.字段a == 某数据实体.字段a);
           innerChild2 = innerChild2.And(p => p.字段b > 某数据实体.字段b);

           var inner = PredicateBuilder.False<测试实体类>();
           inner = inner.Or(innerChild1.Expand());
           inner = inner.Or(innerChild2.Expand()); 

           var condtion = PredicateBuilder.True<测试实体类>();
           condtion = condtion.And(p => p.字段c == 某数据实体.字段c);
           condtion = condtion.And(p => p.字段d == 某数据实体.字段d);

           condtion = condtion.And(inner.Expand());


方法2参考对应的官方网站时,会报 错误 (在指定的 LINQ to Entities 查询表达式中未绑定参数“f”。)

不知道是不是 linqkit不是最新的缘故,google后,发现加上expand方法就可以了。解决参考网站:

http://stackoverflow.com/questions/16462692/nesting-predicatebuilder-predicates-the-parameter-f-was-not-bound-in-the-sp  虽然这个家伙是通过 where(条件1).where(条件2).where(条件3)这种方式来解决的 可是回答他问题的expand方法对我有效,就采用该方法了.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值