聊聊 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 官网 深入了解。

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

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


相关文章
|
存储 NoSQL Linux
MongoDB【部署 02】mongodb使用配置文件启动、添加为系统服务及自启动(一个报错:[13436][NotMasterOrSecondary])
MongoDB【部署 02】mongodb使用配置文件启动、添加为系统服务及自启动(一个报错:[13436][NotMasterOrSecondary])
1128 0
|
API Apache 数据库
Flink CDC 3.0 正式发布,详细解读新一代实时数据集成框架
Flink CDC 于 2023 年 12 月 7 日重磅推出了其全新的 3.0 版本 ~
108881 8
 Flink CDC 3.0 正式发布,详细解读新一代实时数据集成框架
|
存储 自然语言处理 Java
ResourceBundle.getBundle()来读取自定义的properties配置文件
ResourceBundle.getBundle()来读取自定义的properties配置文件
420 1
ServiceHub.DataWarehouseHost.exe内存泄漏问题的处理
Visual Studio 2017的15.2版本在debug应用程序时,ServiceHub.DataWarehouseHost.exe会出现严重的内存泄漏的问题,一个小时左右,内存耗了将近8GB。
3739 0
|
11月前
|
前端开发 C# Windows
在WPF程序中实现PropertyGrid功能
【11月更文挑战第15天】PropertyGrid 是一个用户界面组件,用于直观地查看和编辑对象属性。在 WPF 中可通过组合 Expander 和 DataGrid 实现基本功能,或使用第三方库 PropertyTools 获得更强大特性,包括属性验证和类型特定编辑器。
681 3
【C#】【报错解决】找不到请求的Net Framework Data ProVider。可能没有安装。
【C#】【报错解决】找不到请求的Net Framework Data ProVider。可能没有安装。
1202 0
【C#】【报错解决】找不到请求的Net Framework Data ProVider。可能没有安装。
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
1367 8
|
存储 运维 监控
Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
490 0
|
11月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
642 1
|
10月前
|
人工智能 IDE 程序员
GitHub Copilot 免费了!程序员们的福音来了!
《GitHub Copilot 免费了!程序员们的福音来了!》 近日,GitHub 宣布其 AI 编程助手 GitHub Copilot 现在可以免费使用。曾经每月需支付 10 美元订阅费的 Copilot,现在向所有人开放免费版本,这对个人开发者、初学者和小型团队来说是个大好消息。免费版支持 GPT 和 Claude 模型,并提供每月 2000 次代码补全和 50 条聊天消息等核心功能。用户只需注册或登录 GitHub 账户,在 VS Code 中安装扩展并激活免费版即可使用。此外,Visual Studio Code 也完全免费,进一步降低了开发门槛。 除了
11105 7
GitHub Copilot 免费了!程序员们的福音来了!