文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linq中怎么自定义组合查询

2023-06-17 22:51

关注

本篇文章为大家展示了Linq中怎么自定义组合查询,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

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

///  /// 条件  ///  public class Condition  {      ///      /// 字段      ///      public string Field { get; set; }      ///      /// 表达式      ///      public string Operator { get; set; }      ///      /// 值      ///      public string Value { get; set; }      ///      /// 关系      ///      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自定义表达式编译成expression tree的形式,我只需要将条件对象数组转换为expression tree就可以了。

我先将一个条件转化为一个简单的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表达式,追加到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自定义这么强大,这么爽,比拼where条件的方法优雅多了,开发效率也是提高不少,而且我发现性能也不错,100万级的数据通过索引和分页查询还算可以。

上述内容就是Linq中怎么自定义组合查询,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯