代码如下,某些类是自己写,可以不关注,只关注形成条件部分(方法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方法对我有效,就采用该方法了.