Linq中怎么自定義組合查詢

本篇文章為大家展示了Linq中怎么自定義組合查詢,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

10年積累的網(wǎng)站制作、做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有蒼梧免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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

///  /// 條件  ///  public class Condition  {      ///      /// 字段      ///      public string Field { get; set; }      ///      /// 表達(dá)式      ///      public string Operator { get; set; }      ///      /// 值      ///      public string Value { get; set; }      ///      /// 關(guān)系      ///      public string Relation { get; set; }       ///      ///       ///      ///      ///      ///      ///      ///      public static Condition[] BuildConditions(string[] fileds,string[] operators,string[] values,string[] relations)      {          if (fileds == null || operators == null || values == null || relations == null)          {              return null;          }          Condition[] conditions = new Condition[fileds.Length];          try         {              for (int i = 0; i < conditions.Length; i++)              {                  conditions[i] = new Condition()                  {                      Field = fileds[i],                      Operator = operators[i],                      Value = values[i],                      Relation = relations[i]                  };              }          }          catch         {              return null;          }          return conditions;      }  }

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

我先將一個條件轉(zhuǎn)化為一個簡單的expression。

///  ///   ///  ///  ///  ///  private static Expression ConditonToExpression(Condition condition,Expression parameter)  {      Expression expr = null;      Type type = typeof(EDM_Resource);       PropertyInfo pi = type.GetProperty(condition.Field);      Expression left = Expression.Property(parameter, pi);       object value = Convert.ChangeType(condition.Value, pi.PropertyType);      Expression right = Expression.Constant(value);      switch (condition.Operator)      {          case "=":              expr = Expression.Equal(left, right);              break;          case "<":              expr = Expression.LessThan(left, right);              break;          case "<=":              expr = Expression.LessThanOrEqual(left, right);              break;          case ">":              expr = Expression.GreaterThan(left, right);              break;          case ">=":              expr = Expression.GreaterThanOrEqual(left, right);              break;      }      return expr;  }

然后組合,變成一個lamda表達(dá)式,追加到where上。

///  ///   ///  ///  ///  ///  ///  ///  ///  public IList FindByGroup(EDM_ResGroup resGroup, Condition[] conditions, int first, int limit, out int count)  {      using (ShengjingEDM2Entities context = new ShengjingEDM2Entities())      {          IQueryable result = DoFindByGroup(resGroup, context);          ParameterExpression parameter = Expression.Parameter(typeof(EDM_Resource), "r");          Expression body = null;           if (conditions != null && conditions.Length > 0)          {              body = ConditonToExpression(conditions[0], parameter);              for (int i = 1; i < conditions.Length; i++)              {                  Expression right = ConditonToExpression(conditions[i],parameter);                  body = conditions[i - 1].Relation.ToUpper().Equals("AND") ?                      Expression.And(body, right) :                      Expression.Or(body, right);              }          }           if (body != null)          {              Expression<FUNC<EDM_RESOURCE, < SPAN>bool>> expr = Expression.Lambda<FUNC<EDM_RESOURCE, < SPAN>bool>>(body, parameter);              result = result.Where(expr);          }          result = result.OrderByDescending<EDM_RESOURCE, < SPAN>int>(r => r.ResourceID);          count = result.Count();          return result              .Skip(first)              .Take(limit)              .ToList();      }  }

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

上述內(nèi)容就是Linq中怎么自定義組合查詢,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站標(biāo)題:Linq中怎么自定義組合查詢
當(dāng)前URL:http://muchs.cn/article40/pispeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、品牌網(wǎng)站設(shè)計、移動網(wǎng)站建設(shè)網(wǎng)站設(shè)計、網(wǎng)站排名服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司