前言:System.Linq.Dynamic 是什么?
System.Linq.Dynamic
扩展了 .NET 中的 LINQ 查询功能,通过它,我们可以在运行时动态构造 LINQ 查询表达式,就像是写原生 SQL 语句一样,更加灵活直观。
利用 System.Linq.Dynamic
,我们可以做到:
- 在运行时动态构建 LINQ 查询,根据不同条件或用户输入构造不同的查询语句。
- 灵活指定对查询结果进行排序的方式,例如根据用户选择的不同列进行排序。
- 支持动态选择返回结果的字段,根据需要返回不同的数据结构。
- 根据用户输入或其他条件动态添加过滤条件,实现更灵活的数据筛选。
下面我们通过一个例子来感受它的魅力。
Step By Step 步骤
-
创建一个 .NET Core Console 项目
-
引用 Nuget 包
System.Linq.Dynamic.Core
-
搭建 EF ORM 框架
参考之前的文章《Asp.net core EF Core 使用例子(1)Code First 创建步骤》
说明:也可能不用 EF,直接构建一个集合作为数据源
-
新建一个类文件,写 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; }
-
使用
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; }
总结
- System.Linq.Dynamic 动态查询不仅可以用于 OrderBy, 也可以用于 Select, Where 等地方
- 所谓动态查询就是使用 String 代替 Lambda 表达式
- 代码实际上就是将 String 转成 Lambda 表达式
- 从性能上看,System.Linq.Dynamic 性能稍微不如原始的 Lambda 表达式,但胜在灵活和可扩展。
总而言之,使用 System.Linq.Dynamic 可以简化代码,提高灵活性和可扩展性,它可以在多个业务场景下发挥作用,例如动态搜索、动态报表生成等业务场景。有兴趣的童鞋可以到 System.Linq.Dynamic 官网 深入了解。
我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。
都看到这了,求个点赞、关注、在看三连呗,感谢支持。