聊聊 System.Linq.Dynamic,以及分享一个使用 System.Linq.Dynamic 扩展 LINQ 查询的详细例子

简介: 聊聊 System.Linq.Dynamic,以及分享一个使用 System.Linq.Dynamic 扩展 LINQ 查询的详细例子

前言:System.Linq.Dynamic 是什么?

System.Linq.Dynamic 扩展了 .NET 中的 LINQ 查询功能,通过它,我们可以在运行时动态构造 LINQ 查询表达式,就像是写原生 SQL 语句一样,更加灵活直观。

利用 System.Linq.Dynamic,我们可以做到:

  1. 在运行时动态构建 LINQ 查询,根据不同条件或用户输入构造不同的查询语句。
  2. 灵活指定对查询结果进行排序的方式,例如根据用户选择的不同列进行排序。
  3. 支持动态选择返回结果的字段,根据需要返回不同的数据结构。
  4. 根据用户输入或其他条件动态添加过滤条件,实现更灵活的数据筛选。

下面我们通过一个例子来感受它的魅力。

Step By Step 步骤

  1. 创建一个 .NET Core Console 项目
  2. 引用 Nuget 包

System.Linq.Dynamic.Core

3.搭建 EF ORM 框架

参考之前的文章《Asp.net core EF Core 使用例子(1)Code First 创建步骤

说明:也可能不用 EF,直接构建一个集合作为数据源

4.新建一个类文件,写 IQueryable 的扩展方法,留意注释

/// <summary>
/// 使用动态拼接 OrderBy 语句,分页查询数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="whereLambda"></param>
/// <param name="orderbyExpression"></param>
/// <param name="total"></param>
/// <returns></returns>
public static List<T> FindPageList<T>(this IQueryable<T> source, int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, string orderbyExpression, out int total)
{
  total = source.Where(whereLambda).Count();
  var result = source
    .Where(whereLambda)
    .OrderBy(orderbyExpression)
    .Skip(pageSize * (pageIndex - 1))
    .Take(pageSize)
    .ToList();
  return result;
}

5.使用

public List<UserMenuDTO> QueryPageList(QueryPageParamsForuserMenu queryPageParams, out int total)
{
  var query = userMenuReposition.QueryMenuUsers(queryPageParams.MenuUserName);
  
  Expression<Func<UserMenuDTO, bool>> whereLambda = a => true;
  
  if (queryPageParams.CompanyCodes != null && queryPageParams.CompanyCodes.Length > 0)
  {
    Expression<Func<UserMenuDTO, bool>> second = (a => queryPageParams.CompanyCodes.Contains(a.COMPHT03));
    whereLambda = whereLambda.And(second); 
  }
  
  // 直接输入要排序的字段,System.Linq.Dynamic 自动生成排序语句
  var list = query.FindPageList(queryPageParams.PageIndex, queryPageParams.PageSize, whereLambda, "COMPHT03, MNUCDHT03", out total);
  
  return list;
}

总结

  1. System.Linq.Dynamic 动态查询不仅可以用于 OrderBy, 也可以用于 Select, Where 等地方
  2. 所谓动态查询就是使用 String 代替 Lambda 表达式
  3. 代码实际上就是将 String 转成 Lambda 表达式
  4. 从性能上看,System.Linq.Dynamic 性能稍微不如原始的 Lambda 表达式,但胜在灵活和可扩展。

总而言之,使用 System.Linq.Dynamic 可以简化代码,提高灵活性和可扩展性,它可以在多个业务场景下发挥作用,例如动态搜索、动态报表生成等业务场景。有兴趣的童鞋可以到 System.Linq.Dynamic 官网 深入了解。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。


相关文章
|
7月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---group和join相关用法(三)
C#学习相关系列之Linq用法---group和join相关用法(三)
263 1
|
自然语言处理 .NET
Linq使用Group By
1.简单形式: var q = from p in db.Products group p by p.CategoryID into g select g; 语句描述:Linq使用Group By按CategoryID划分产品。
3944 0
|
SQL 存储 .NET
一起谈.NET技术,使用LINQ Expression构建Query Object
  这个问题来源于Apworks应用开发框架的设计。由于命令与查询职责的分离,使得基于CQRS体系结构风格的应用系统的外部存储系统的结构变得简单起来:在“命令”部分,简单地说,只需要 Event Store和Snapshot Store来保存Domain Model;而“查询”部分,则又是基于事件派送与侦听的系统集成。
998 0
|
SQL 存储 .NET
使用LINQ Expression构建Que“.NET研究”ry Object
  这个问题来源于Apworks应用开发框架的设计。由于命令与查询职责的分离,使得基于CQRS体系结构风格的应用系统的外部存储系统的结构变得简单起来:在“命令”部分,简单地说,只需要 Event Store和Snapshot Store来保存Domain Model;而“查询”部分,则又是基于事件派送与侦听的系统集成。
1009 0
|
.NET 开发框架 数据库
深入调研Linq to Objects Join Linq to Entity
最近工作中遇到数据库组合查询带来的一些问题,因此有必要调研一下Linq to Objects Join Linq to Entity。参考一些网友的代码案例,深入实践了一下使用EntityFramework Code First 下的组合查询。
1255 0