成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何解決用戶Linq自定義組合查詢

開發(fā) 后端
本文詳細(xì)講解了Linq自定義組合查詢的實(shí)現(xiàn)方法,希望能給大家?guī)硪恍﹩⑹尽?/div>

如何解決Linq自定義組合查詢?看起來似乎是個(gè)不太難的問題。但很多人仍然會(huì)卡在這里不知如何下手,今天我就用我的經(jīng)歷來給大家做一個(gè)例子。

當(dāng)年,俺被誤導(dǎo),說是怎么實(shí)現(xiàn)Linq自定義組合捏?因?yàn)長inq是預(yù)編譯滴,沒有辦法想拼一個(gè)sql字符串出來,讓我糾結(jié)很久,但是,我覺得微軟的人應(yīng)該比較厲害,所以我本著“有困難要上,沒有困難制造困難也要上”的原則,在還沒有熟悉LINQ TO ADO.NET的情況下,我覺得決定在最近的我自己獨(dú)立完成小項(xiàng)目里使用ASP.NET MVC + ADO.NET EF。

一般的信息系統(tǒng)都有一個(gè)組合查詢的功能,我很快用jquery做了這樣一個(gè)功能。

 

這個(gè)表單將Linq自定義組合條件提交后臺(tái),我先將它封裝成條件對(duì)象的數(shù)組。

  1. ///   
  2. /// 條件  
  3. /// 
  4.  
  5. public class Condition  
  6. {  
  7.     ///   
  8.     /// 字段  
  9.     /// 
  10.  
  11.     public string Field { getset; }  
  12.     ///   
  13.     /// 表達(dá)式  
  14.     /// 
  15.  
  16.     public string Operator { getset; }  
  17.     ///   
  18.     /// 值  
  19.     /// 
  20.  
  21.     public string Value { getset; }  
  22.     ///   
  23.     /// 關(guān)系  
  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#

實(shí)際上,編譯器是把Linq自定義表達(dá)式編譯成expression tree的形式,我只需要將條件對(duì)象數(shù)組轉(zhuǎn)換為expression tree就可以了。

我先將一個(gè)條件轉(zhuǎn)化為一個(gè)簡單的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#

然后組合,變成一個(gè)lamda表達(dá)式,追加到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.             Expressionbool>> expr = Expression.Lambdabool>>(body, parameter);  
  34.             result = result.Where(expr);  
  35.         }  
  36.         result = result.OrderByDescendingint>(r => r.ResourceID);  
  37.         count = result.Count();  
  38.         return result  
  39.             .Skip(first)  
  40.             .Take(limit)  
  41.             .ToList();  
  42.     }  

原來Linq自定義這么強(qiáng)大,這么爽,比拼where條件的方法優(yōu)雅多了,開發(fā)效率也是提高不少,而且我發(fā)現(xiàn)性能也不錯(cuò),100萬級(jí)的數(shù)據(jù)通過索引和分頁查詢還算可以。

【編輯推薦】

  1. LINQ——語言級(jí)集成查詢?nèi)腴T指南
  2. LINQ查詢的目的與實(shí)現(xiàn)手段
  3. 實(shí)例二:綁定到LINQ查詢的結(jié)果
  4. LINQ查詢表達(dá)式深入剖析
  5. LINQ的演變及其對(duì)C#設(shè)計(jì)的影響
責(zé)任編輯:林琳 來源: Javaeye
相關(guān)推薦

2009-09-07 22:00:15

LINQ自定義

2009-09-13 18:58:07

自定義LINQ提供器

2009-09-07 22:29:04

LINQ組合查詢

2021-06-17 06:52:37

C#自定義異常

2015-02-12 15:38:26

微信SDK

2018-07-06 15:58:34

SpringSchemaJava

2009-09-09 13:39:05

Linq用戶定義函數(shù)

2009-09-15 17:45:34

Linq多條件

2013-06-27 11:10:01

iOS開發(fā)自定義UISlider

2010-10-20 16:07:48

SQL用戶自定義角色

2009-08-03 13:39:46

C#自定義用戶控件

2021-07-16 11:00:40

Django用戶模型Python

2010-02-07 14:02:16

Android 界面

2011-03-02 10:24:23

DashboardAndroid用戶界面設(shè)計(jì)模板

2015-02-12 15:33:43

微信SDK

2021-07-15 16:41:21

Swift查詢函數(shù)

2009-09-07 22:54:03

Linq組合查詢

2011-03-29 13:29:10

2009-09-03 13:34:03

.NET自定義控件

2023-01-03 07:40:27

自定義滑塊組件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品久久久久久久一区二区 | 国产一区二区三区在线免费观看 | 日韩一区二区成人 | 毛片.com | 亚洲欧美成人在线 | 久久日本| 亚洲精品视频一区 | 毛片网在线观看 | www亚洲精品 | 在线免费观看黄色 | 亚洲第一av | 成人一级视频在线观看 | 精品国产一二三区 | 精品国偷自产在线 | 一区二区三区电影网 | 欧美在线观看一区 | 亚洲三区视频 | 午夜私人影院在线观看 | 国产乱码精品1区2区3区 | 操操操av | 中文字幕久久精品 | 一区二区蜜桃 | 农夫在线精品视频免费观看 | 99色综合 | 一区二区三区免费 | 亚洲精品电影网在线观看 | 久草青青草 | 国产精品久久久久久久久污网站 | av中文字幕在线播放 | 国产成人免费视频网站高清观看视频 | 欧美一区二区大片 | 精品国产一区二区三区久久狼黑人 | 中文字幕第九页 | 成人免费观看视频 | 国产成人在线免费 | 久久久久国产一区二区三区四区 | 九九精品影院 | 天天久久 | 中文字字幕一区二区三区四区五区 | 日韩欧美一级精品久久 | 天堂在线网 |