如何解决用户Linq自定义组合查询

如何解决Linq自定义组合查询?看起来似乎是个不太难的问题。但很多人仍然会卡在这里不知如何下手,今天我就用我的经历来给大家做一个例子。

创新互联建站 - 成都服务器托管,四川服务器租用,成都服务器租用,四川网通托管,绵阳服务器托管,德阳服务器托管,遂宁服务器托管,绵阳服务器托管,四川云主机,成都云主机,西南云主机,成都服务器托管,西南服务器托管,四川/成都大带宽,机柜大带宽租用·托管,四川老牌IDC服务商

当年,俺被误导,说是怎么实现Linq自定义组合捏?因为Linq是预编译滴,没有办法想拼一个sql字符串出来,让我纠结很久,但是,我觉得微软的人应该比较厉害,所以我本着“有困难要上,没有困难制造困难也要上”的原则,在还没有熟悉LINQ TO ADO.NET的情况下,我觉得决定在最近的我自己独立完成小项目里使用ASP.NET MVC + ADO.NET EF。

一般的信息系统都有一个组合查询的功能,我很快用jquery做了这样一个功能。

这个表单将Linq自定义组合条件提交后台,我先将它封装成条件对象的数组。

 
 
 
 
  1. ///   
  2. /// 条件  
  3. /// 
  4.  
  5. public class Condition  
  6. {  
  7.     ///   
  8.     /// 字段  
  9.     /// 
  10.  
  11.     public string Field { getset; }  
  12.     ///   
  13.     /// 表达式  
  14.     /// 
  15.  
  16.     public string Operator { getset; }  
  17.     ///   
  18.     /// 值  
  19.     /// 
  20.  
  21.     public string Value { getset; }  
  22.     ///   
  23.     /// 关系  
  24.     /// 
  25.  
  26.     public string Relation { getset; }  
  27.  
  28.     ///   
  29.     ///   
  30.     /// 
  31.  
  32.     ///   
  33.     ///   
  34.     ///   
  35.     ///   
  36.     ///   
  37.     public static Condition[] BuildConditions(string[] fileds,string[] operators,string[] values,string[] relations)  
  38.     {  
  39.         if (fileds == null || operators == null || values == null || relations == null)  
  40.         {  
  41.             return null;  
  42.         }  
  43.         Condition[] conditions = new Condition[fileds.Length];  
  44.         try 
  45.         {  
  46.             for (int i = 0; i < conditions.Length; i++)  
  47.             {  
  48.                 conditions[i] = new Condition()  
  49.                 {  
  50.                     Field = fileds[i],  
  51.                     Operator = operators[i],  
  52.                     Value = values[i],  
  53.                     Relation = relations[i]  
  54.                 };  
  55.             }  
  56.         }  
  57.         catch 
  58.         {  
  59.             return null;  
  60.         }  
  61.         return conditions;  
  62.     }  

#p#

实际上,编译器是把Linq自定义表达式编译成expression tree的形式,我只需要将条件对象数组转换为expression tree就可以了。

我先将一个条件转化为一个简单的expression。

 
 
 
 
  1. ///   
  2. ///   
  3. /// 
  4.  
  5. ///   
  6. ///   
  7. ///   
  8. private static Expression ConditonToExpression(Condition condition,Expression parameter)  
  9. {  
  10.     Expression expr = null;  
  11.     Type type = typeof(EDM_Resource);  
  12.  
  13.     PropertyInfo pi = type.GetProperty(condition.Field);  
  14.     Expression left = Expression.Property(parameter, pi);  
  15.  
  16.     object value = Convert.ChangeType(condition.Value, pi.PropertyType);  
  17.     Expression right = Expression.Constant(value);  
  18.     switch (condition.Operator)  
  19.     {  
  20.         case "=":  
  21.             expr = Expression.Equal(left, right);  
  22.             break;  
  23.         case "<":  
  24.             expr = Expression.LessThan(left, right);  
  25.             break;  
  26.         case "<=":  
  27.             expr = Expression.LessThanOrEqual(left, right);  
  28.             break;  
  29.         case ">":  
  30.             expr = Expression.GreaterThan(left, right);  
  31.             break;  
  32.         case ">=":  
  33.             expr = Expression.GreaterThanOrEqual(left, right);  
  34.             break;  
  35.     }  
  36.     return expr;  

#p#

然后组合,变成一个lamda表达式,追加到where上。

 
 
 
 
  1. ///   
  2. ///   
  3. /// 
  4.  
  5. ///   
  6. ///   
  7. ///   
  8. ///   
  9. ///   
  10. ///   
  11. public IList  FindByGroup(EDM_ResGroup resGroup, Condition[] conditions,  int first, int limit, out int count)  
  12. {  
  13.     using (ShengjingEDM2Entities context = new ShengjingEDM2Entities())  
  14.     {  
  15.         IQueryable  result = DoFindByGroup(resGroup, context);  
  16.         ParameterExpression parameter = Expression.Parameter(typeof(EDM_Resource), "r");  
  17.         Expression body = null;  
  18.  
  19.         if (conditions != null && conditions.Length > 0)  
  20.         {  
  21.             body = ConditonToExpression(conditions[0], parameter);  
  22.             for (int i = 1; i < conditions.Length; i++)  
  23.             {  
  24.                 Expression right = ConditonToExpression(conditions[i],parameter);  
  25.                 body = conditions[i - 1].Relation.ToUpper().Equals("AND") ?  
  26.                     Expression.And(body, right) :  
  27.                     Expression.Or(body, right);  
  28.             }  
  29.         }  
  30.  
  31.         if (body != null)  
  32.         {  
  33.             Expression bool>> expr = Expression.Lambda bool>>(body, parameter);  
  34.             result = result.Where (expr);  
  35.         }  
  36.         result = result.OrderByDescending int>(r => r.ResourceID);  
  37.         count = result.Count ();  
  38.         return result  
  39.             .Skip (first)  
  40.             .Take (limit)  
  41.             .ToList ();  
  42.     }  

原来Linq自定义这么强大,这么爽,比拼where条件的方法优雅多了,开发效率也是提高不少,而且我发现性能也不错,100万级的数据通过索引和分页查询还算可以。

分享标题:如何解决用户Linq自定义组合查询
网站链接:http://www.mswzjz.cn/qtweb/news33/151033.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能