sqlserver分页查询关键字_.NET:使用 LinqSharp 简化复杂查询

73803f06fe7b0053cb3df9dce7bf86d4.png

LinqSharp 是个开源 LINQ 扩展库,它允许您编写简单代码来生成复杂查询,包括查询扩展和动态查询生成。

LinqSharp.EFCore 是对 EntityFramework 的增强库,提供更多数据注解、数据库函数及自定义储存规则等。

LinqSharp:为 LINQ 提供更多通用扩展​github.com

由于内容较多,将分篇介绍公开内容、原理及案例分享:

  1. LinqSharp:简化复杂查询
  2. LinqSharp:动态构建 LINQ 查询
  3. LinqSharp.EFCore:表设计数据注解
  4. LinqSharp.EFCore:字段标准化数据注解
  5. LinqSharp.EFCore:函数映射
  6. LinqSharp.EFCore:列式存储代理
  7. LinqSharp.EFCore:关联计算与审计

本文多数示例,提供在线运行测试(.NET Fiddle)。


LinqSharpLINQ 提供了以下增强(“内存查询”或“SQL生成”):

  • 默认返回方法MinOrDefault:提供默认返回的 Min 方法;MaxOrDefault:提供默认返回的 Max 方法;AverageOrDefault:提供默认返回的 Average 方法。
  • 查询值最小或最大的记录WhereMin:查询指定字段最小的记录;WhereMax:查询指定字段最大的记录。
  • 数据搜索Search:在指定字段或链接表字段中模糊或精确查询数据;
  • 分页查询SelectPage:查询结果分页或执行分页查询。
  • 序列排序OrderByCase / ThenByCase:按指定字符串序列排序。
  • 构建动态查询XWhere:构建动态查询。

以下方法仅提供于内存查询:

  • 按组元素数量分组GroupByCount:按分组记录元素数量分组。
  • 树结构查询SelectMore:按树结构遍历,选择“所有树节点中满足条件的节点”;SelectUntil:按树结构遍历,直到在每个子路径中找到满足条件的节点,选择该节点;SelectWhile:按树结构遍历,选择“所有子路径中连续满足条件的路径节点”。

示例库 Northwnd

Northwnd SQL Server 早期附带的示例数据库,该数据库描述“公司销售产品网”简单案例场景。包括“雇员(Employees)”“产品订单(Orders)”“供应商(Suppliers)”的关系网络。

本文示例使用的是它的 Sqlite 版本(Code First):

zmjack/Northwnd​github.com
5b540b1c369642b69d1d5de8cb8c9ae1.png

通过 NuGet 安装:

dotnet 

简单使用:

using 

输出 SQL

输出 SQL”是研究“SQL 生成”的基础,使用 LinqSharp.EFCore 中的 ToSql 方法:

(在线示例:ToSql | C# Online Compiler)

using 

生成 SQL:

SELECT 

注1:由于不同版本的 EntityFrameworkCoreSQL 生成器设计不同,因此,生成 SQL 可能会存在差异。(EntityFrameworkCore 5.0 公开了 ToQueryString 来支持这项功能)。

注2LinqSharp.EFCore 最新版本不兼容所有 EntityFrameworkCore,需使用“大版本号”与 EntityFrameworkCore 一致的发行库(例如,2.2.x,3.0.x,3.1.x)。

默认返回方法扩展

  • MinOrDefault:原函数 Min 的不抛异常版本,异常返回默认值;
  • MaxOrDefault:原函数 Max 的不抛异常版本,异常返回默认值;
  • AverageOrDefault: 原函数 Average 的不抛异常版本,异常返回默认值。

(在线示例:MinOrDefault | C# Online Compiler)

// throw 'Sequence contains no elements'

查询值最小或最大的记录

  • WhereMin:查询指定字段最小的记录;
  • WhereMax:查询指定字段最大的记录。

WhereMin WhereMax 会进行两次查询:

  1. 查询指定字段的“最小值”或“最大值”;
  2. 查询指定字段“最小值”或“最大值”的记录。

例如,查询员工(Empolyees)表中年龄最小的员工:

b7a1a54762be8fe150a93d096523b241.png

(在线示例:WhereMax | C# Online Compiler)

var 

生成 SQL:

/* Step 1 */

运行结果:

59bf10b4bc0500620d7460d7ff69ef92.png

数据搜索

  • Search:返回“从指定字段或外键表字段中进行模糊或精确查询”的查询结果。

Search 函数提供了四种搜索模式(SearchOption):

  • Contains(默认): 任何指定字段中“包含”搜索字符串;
  • NotContains:所有指定字段中都“不包含”搜索字符串;
  • Equals:搜索字符串与某指定字段“相等”;
  • NotEquals:搜索字符串“不在”任何指定字段中。

例如,查询雇员(Employees)表中地址(Address)或城市(City)包含字母 m 的雇员:

ea2a414d32c082861ce7f2c9152bc266.png

(在线示例:Search | C# Online Compiler)

var 

生成 SQL:

SELECT 

运行结果:

798036c4c32ba485410a5482b3b9b263.png

Search 函数同样提供了外链表的查询(主表或从表查询)。

例如,查询供应商(Suppliers)表中供应任何种类豆腐(Tofu)的供应商:

4e78383acebce379a2477d6ca0aea53d.png

(在线示例:Search (Details) | C# Online Compiler)

var 

生成 SQL:

SELECT 

运行结果:

f5e36dca8f47b136b7295f63c7024f72.png

分页查询

  • SelectPage:查询结果分页或执行分页查询。(分页参数从第 1 页开始)

例如,查询雇员(Employees)表,按每页 2 条记录分页,选择第 3 页的记录返回:

b8d8921281b8cb5b32bfe242695e0b28.png

(在线示例:SelectPage | C# Online Compiler)

var 

生成 SQL:

SELECT 

运行结果:

ae3f92cdfca85d6c53a676d82468bb86.png

序列排序

  • OrderByCase / ThenByCase:按指定字符串序列排序。

例如,查询地区(Regions)表,将结果按 N / E / W / S 的地区序列排序返回:

34913851c173bcc483241f7e740cf37c.png

(在线示例:OrderByCase | C# Online Compiler)

var 

执行 SQL:

SELECT 

运行结果:

6bdc7128cda21b59d0f643d19d9c311e.png

按组元素数量分组

数量分组函数 GroupByCount 用于根据指定每组记录数量(每组最多允许 n 条记录)进行特殊分组。

例如,将如下指定字符串按每行 16 个字符分成多行:

var 
0123456789ABCDEF
0123456789ABCDEF

树结构查询

  • SelectMore:按树结构遍历,选择“树节点中 所有 满足条件的 节点”;
  • SelectUntil:按树结构遍历,直到 在每个子路径中找到满足条件的节点,选择 该节点
  • SelectWhile:按树结构遍历,选择“所有子路径 中连续满足条件的 路径节点”。

例如,雇员(Employees)表按照 EmployeeID ReportsTo 定义结构如下:

1b26dbda83ad30e4c543d8482f0cba78.png

524e236e1496a856e13ffaea0d353459.png

SelectMore

按树结构遍历,选择“树节点中 所有 满足条件的 节点”。

例如,查询由 2 号雇员 Andrew 领导的所有成员(2, 1, 3, 4, 5, 6, 7, 9, 8):

c253805774aa39b4a95c1346f99ce28b.png

方法: 使用 SelectMore 从根节点查找即可。

(在线示例:SelectMore | C# Online Compiler)

var 

运行结果:

35a9a0e58b61cc16045a034704977ee6.png

SelectUntil

按树结构遍历,直到 在每个子路径中找到满足条件的节点,选择 该节点

例如,查询由 2 号雇员 Andrew 领导的所有基层员工(叶节点,1, 3, 6, 7, 9, 8):

c4930637274e9f176a879e9be67c6dfb.png

方法:使用 SelectUntil 从根节点查找,直到节点 Subordinates 为空。

(在线示例:SelectUntil | C# Online Compiler)

var 

运行结果:

48240cde4a3b0f5458749a516bd292d5.png

SelectWhile

按树结构遍历,选择“所有子路径 中连续满足条件的 路径节点”。

例如,查询由 2 号雇员 Andrew 领导的所有非基层员工(非叶节点,2, 5):

991fc180dbde39ff420ceb14fc479cca.png

方法:使用 SelectWhile 从根节点查找路径,直到节点 Subordinates 为空。

(在线示例:SelectWhile | C# Online Compiler)

var 

运行结果:

472c691e56dc354ea486e569361cde9d.png

下篇文章将介绍如何使用 LinqSharp “动态生成查询”,敬请关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值