[转载]简单解决Linq多条件组合问题

[转载]简单解决Linq多条件组合问题 – 51CTO.COM.

本文笔者用清晰的实例,解决了Linq多条件问题,思路十分的清晰,笔者也很细心的做了描述,希望能给你带来帮助。

最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆Linq,所以很多东西都要从存储过程搬过来..昨天写评价功能的时候,碰到个Linq多条件叠加组合的问题,其需求如下:

多种查询评价的条件:

1.Linq多条件之查询类型:

收到的评价_买家给我的评价,收到的评价_卖家给我的评价,给出的评价_我给买家的评价,给出的评价_我给卖家的评价

public enum OpinionSearchType
{
收到的评价_买家给我的评价 = 0,
收到的评价_卖家给我的评价 = 1,
给出的评价_我给买家的评价 = 2,
给出的评价_我给卖家的评价 = 3
}

2.Linq多条件之评价类型:

全部,好评,中评,差评

public enum OpinionType
{
全部 = 0,
好评 = 1,
中评 = 2,
差评 = 3
}

3.Linq多条件之评价查询时间:

全部,一个星期内,一个月以内,六个月以内,六个月以外

public enum OpinionTime
{
全部 = 0,
一个星期内 = 1,
一个月以内 = 2,
六个月以内 = 3,
六个月以外 = 4
}

由于缓存的需要,要把Expression完成之后再传到接口那边获取相应的List<评价意见>.按照这样的看的话,

总共3个条件, 13个子条件, 排列组合之后, 会有80种的组合. – – 真的一个个组合去写的话,还真是累死人了..

左思右想,最好的方法就是把3个条件都拆开来,完成不同的Expression,到最后再把三个条件组合在一起成为一个新的Expression. 网上找到的比较都只是单条件的Parameter, 查了MSDN,才知道有个Expression.And(left, right)可以完成我的需求.利用.net3.5的扩展方法写成了一个组合Expression的方法,再重载了几个多参数的表达式,如下:

#region 表达式
public static Expression ContactExpressions(this Expression exp, params Expression[] exps) {
foreach (var e in exps) {
if (null == e) continue;
exp = Expression.And(exp, e);
}
return exp;
}
public static Expression&gt; ContactExpressions(this Expression exp, params Expression[] exps) {
foreach (var e in exps) {
if (null == e) continue;
exp = Expression.And(exp, e);
}
return (Expression&gt;)exp;
}

public static Expression&gt; ContactExpressions(this Expression exp, params Expression[] exps) {
foreach (var e in exps) {
if (null == e) continue;
exp = Expression.And(exp, e);
}
return (Expression&gt;)exp;
}
public static Expression&gt; ContactExpressions(this Expression exp, params Expression[] exps) {
foreach (var e in exps) {
if (null == e) continue;
exp = Expression.And(exp, e);
}
return (Expression&gt;)exp;
}

public static Expression&gt; ContactExpressions(this Expression exp,
params Expression[] exps) {
foreach (var e in exps) {
if (null == e) continue;
exp = Expression.And(exp, e);
}
return (Expression&gt;)exp;
}

#endregion

有了这几个方法进行Linq多条件查询,原本的需求就可以迎刃而解了:

    Expression< span="">bool>> expSearchType = null;  <>
     Expression< span="">bool>> expOpinionType = null;  <>
    Expression< span="">bool>> expOpinionTime = null;  <>
    switch (searchType) {  
        case OpinionSearchType.给出的评价_我给买家的评价:  
            expSearchType = Y => Y.UserID == userID && !Y.IsSeller;  
             break;  
        case OpinionSearchType.给出的评价_我给卖家的评价:  
          expSearchType = Y => Y.UserID == userID && Y.IsSeller;  
            break;  
         case OpinionSearchType.收到的评价_买家给我的评价:  
            expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller;  
            break;  
        case OpinionSearchType.收到的评价_卖家给我的评价:  
            expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller;  
             break;  
     }  
     switch (opinType) {  
         case OpinionType.好评:  
             expOpinionType = Y => Y.OpinionType == 0;  
             break;  
        case OpinionType.中评:  
             expOpinionType = Y => Y.OpinionType == 1;  
             break;  
         case OpinionType.差评:  
             expOpinionType = Y => Y.OpinionType == 2;  
             break;  
     }   
     switch (opinTime) {  
         case OpinionTime.一个星期内:  
             expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 7;  
             break;  
         case OpinionTime.一个月以内:  
             expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 30;  
             break;  
         case OpinionTime.六个月以内:  
             expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 180;  
             break;  
         case OpinionTime.六个月以外:  
             expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days > 180;  
             break;  
     }  
      //GetPaged(params) 这个方法是用来获取列表并支持缓存保存的.  
     return GetPaged(expSearchType.ContactExpressions< span="">bool>(expOpinionType, expOpinionTime),  <>
         userID.UserTablePrefx(), true, pageIndex, pageSize); 

以上就是通过Linq实例解析Linq的另类用法,然后解决Linq多条件组合问题。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏