自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何解決用戶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)長(zhǎng)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è)簡(jiǎn)單的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組合查詢

2018-07-06 15:58:34

SpringSchemaJava

2015-02-12 15:38:26

微信SDK

2021-06-17 06:52:37

C#自定義異常

2009-09-15 17:45:34

Linq多條件

2009-09-09 13:39:05

Linq用戶定義函數(shù)

2013-06-27 11:10:01

iOS開發(fā)自定義UISlider

2010-10-20 16:07:48

SQL用戶自定義角色

2009-08-03 13:39:46

C#自定義用戶控件

2010-02-07 14:02:16

Android 界面

2009-09-07 22:54:03

Linq組合查詢

2021-07-15 16:41:21

Swift查詢函數(shù)

2020-11-19 10:50:43

ImportPython代碼

2021-07-16 11:00:40

Django用戶模型Python

2011-03-02 10:24:23

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

2016-11-16 21:55:55

源碼分析自定義view androi

2011-06-23 10:49:13

Qt 自定義信號(hào)

2015-02-12 15:33:43

微信SDK
點(diǎn)贊
收藏

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