- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
Baozi, I'm Mr.Zhong I like to brush TikTok, I know that anchors like to call it that, haha! Recently, I haven't been so busy, and it took almost a day to add some APIs to the self-developed ORM framework to perfectly implement the Include query 。
宝子们,我是 Mr.Zhong 喜欢刷抖音都知道 主播都喜欢这么叫,哈哈! 最近没那么忙了,抽空给自研的ORM 框架新增一些API 花了将近一天的时间 完美实现 Include 查询 。
。
1、接口定义 。
1 /// <summary> 2 /// 包括接口类 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <typeparam name="TProperty"></typeparam> 6 public interface IInclude<T, TProperty> : IQuery<T> where TProperty : class , new () 7 { 8 /// <summary> 9 /// Ado 10 /// </summary> 11 IAdo Ado { get ; } 12 }
2、接口实现 。
1 /// <summary> 2 /// 包括实现类 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 public class IncludeProvider<T, TProperty> : QueryProvider<T>, IInclude<T, TProperty> where TProperty : class , new () 6 { 7 /// <summary> 8 /// Ado 9 /// </summary> 10 public IAdo Ado { get ; } 11 12 /// <summary> 13 /// 构造方法 14 /// </summary> 15 /// <param name="ado"></param> 16 /// <param name="queryBuilder"> 查询构建 </param> 17 public IncludeProvider(IAdo ado, IQueryBuilder queryBuilder) : base (ado, queryBuilder) 18 { 19 this .Ado = ado; 20 } 21 }
3、扩展方法实现 还可以扩展很多功能 只有你想不到,没有... 。
1 /// <summary> 2 /// 包括扩展类 3 /// </summary> 4 public static class IncludeExtensions 5 { 6 /// <summary> 7 /// 然后包括 8 /// </summary> 9 /// <typeparam name="T"></typeparam> 10 /// <typeparam name="TPreviousProperty"></typeparam> 11 /// <param name="include"> 包括 </param> 12 /// <returns></returns> 13 public static IInclude<T, TPreviousProperty> Visit<T, TPreviousProperty>( this IInclude<T, List<TPreviousProperty>> include) where TPreviousProperty : class , new () 14 { 15 return new IncludeProvider<T, TPreviousProperty> (include.Ado, include.QueryBuilder); 16 } 17 18 /// <summary> 19 /// 然后包括 20 /// </summary> 21 /// <typeparam name="T"></typeparam> 22 /// <typeparam name="TProperty"></typeparam> 23 /// <param name="include"> 包括 </param> 24 /// <param name="expression"> 表达式 </param> 25 /// <returns></returns> 26 public static IInclude<T, TProperty> ThenInclude<T, TPreviousProperty, TProperty>( this IInclude<T, List<TPreviousProperty>> include, Expression<Func<TPreviousProperty, TProperty>> expression) where TProperty : class , new () 27 { 28 return new IncludeProvider<T, TProperty> (include.Ado, include.QueryBuilder); 29 } 30 31 /// <summary> 32 /// 条件 33 /// </summary> 34 /// <typeparam name="T"></typeparam> 35 /// <typeparam name="TProperty"></typeparam> 36 /// <param name="include"> 包括 </param> 37 /// <param name="expression"> 表达式 </param> 38 /// <returns></returns> 39 public static IInclude<T, TProperty> Where<T, TProperty>( this IInclude<T, TProperty> include, Expression<Func<T, TProperty, bool >> expression) where TProperty : class , new () 40 { 41 var queryBuilder = include.QueryBuilder.IncludeInfos.Last().QueryBuilder; 42 43 queryBuilder.EntityDbMapping.Alias = expression.Parameters[ 0 ]? .Name; 44 include.QueryBuilder.IncludeInfos.Last().EntityDbMapping.Alias = expression.Parameters[ 1 ]? .Name; 45 46 var result = expression.ResolveSql( new ResolveSqlOptions() 47 { 48 DbType = include.Ado.DbOptions.DbType, 49 ResolveSqlType = ResolveSqlType.Where, 50 ParameterIndex = queryBuilder.DbParameters.Count + 1 51 }); 52 53 queryBuilder.Where.Add(result.SqlString); 54 queryBuilder.DbParameters.AddRange(result.DbParameters); 55 return include; 56 } 57 58 /// <summary> 59 /// 排序 60 /// </summary> 61 /// <typeparam name="T"></typeparam> 62 /// <typeparam name="TProperty"></typeparam> 63 /// <param name="include"> 包括 </param> 64 /// <param name="orderFields"> 排序字段 </param> 65 /// <param name="orderByType"> 排序类型 </param> 66 /// <returns></returns> 67 public static IInclude<T, TProperty> OrderBy<T, TProperty>( this IInclude<T, TProperty> include, List< string > orderFields, OrderByType orderByType = OrderByType.ASC) where TProperty : class , new () 68 { 69 var queryBuilder = include.QueryBuilder.IncludeInfos.Last().QueryBuilder; 70 71 queryBuilder.OrderBy.Add($ " {string.Join( " , " , orderFields)} {orderByType} " ); 72 return include; 73 } 74 75 /// <summary> 76 /// 排序 77 /// </summary> 78 /// <typeparam name="T"></typeparam> 79 /// <typeparam name="TProperty"></typeparam> 80 /// <param name="include"> 包括 </param> 81 /// <param name="expression"> 表达式 </param> 82 /// <param name="orderByType"> 排序类型 </param> 83 /// <returns></returns> 84 public static IInclude<T, TProperty> OrderBy<T, TProperty>( this IInclude<T, TProperty> include, Expression<Func<T, TProperty, object >> expression, OrderByType orderByType = OrderByType.ASC) where TProperty : class , new () 85 { 86 var queryBuilder = include.QueryBuilder.IncludeInfos.Last().QueryBuilder; 87 88 queryBuilder.EntityDbMapping.Alias = expression.Parameters[ 0 ]? .Name; 89 include.QueryBuilder.IncludeInfos.Last().EntityDbMapping.Alias = expression.Parameters[ 1 ]? .Name; 90 91 var result = expression.ResolveSql( new ResolveSqlOptions() 92 { 93 DbType = include.Ado.DbOptions.DbType, 94 ResolveSqlType = ResolveSqlType.OrderBy 95 }); 96 97 queryBuilder.OrderBy.Add($ " {result.SqlString} {orderByType} " ); 98 return include; 99 } 100 101 /// <summary> 102 /// 选择 103 /// </summary> 104 /// <typeparam name="T"></typeparam> 105 /// <typeparam name="TProperty"></typeparam> 106 /// <param name="include"> 包括 </param> 107 /// <param name="expression"> 表达式 </param> 108 /// <returns></returns> 109 public static IInclude<T, TProperty> Select<T, TProperty>( this IInclude<T, TProperty> include, Expression<Func<T, TProperty, object >> expression) where TProperty : class , new () 110 { 111 var queryBuilder = include.QueryBuilder.IncludeInfos.Last().QueryBuilder; 112 113 queryBuilder.EntityDbMapping.Alias = expression.Parameters[ 0 ]? .Name; 114 include.QueryBuilder.IncludeInfos.Last().EntityDbMapping.Alias = expression.Parameters[ 1 ]? .Name; 115 116 var result = expression.ResolveSql( new ResolveSqlOptions() 117 { 118 DbType = include.Ado.DbOptions.DbType, 119 ResolveSqlType = ResolveSqlType.NewAs 120 }); 121 122 queryBuilder.Columns = result.SqlString; 123 queryBuilder.DbParameters.AddRange(result.DbParameters); 124 return include; 125 } 126 127 } 128 }
。
。
4、使用示例 。
1 var data = await db.Query<Category>().Include(a => a.Products).Visit().OrderBy((a1, a2) => a2.CreateTime, OrderByType.DESC).ToListAsync();
。
5、生成的SQL语句 。
SELECT a1.`CategoryId`,a1.`CategoryName`,a2.`ProductId`,a2.`CategoryId`,a2.`ProductCode`,a2.`ProductName`,a2.`DeleteMark`,a2.`CreateTime`,a2.`ModifyTime`,a2.`Custom1`,a2.`Custom2`,a2.`Custom3`,a2.`Custom4`,a2.`Custom5`,a2.`Custom6`,a2.`Custom7`,a2.`Custom8`,a2.`Custom9`,a2.`Custom10`,a2.`Custom11`,a2.`Custom12` FROM `Category` `a1` INNER JOIN `Product` `a2` ON `a1`.`CategoryId` = `a2`.`CategoryId` WHERE `a1`.`CategoryId` = @CategoryId ORDER BY `a2`.`CreateTime` DESC
。
。
。
最后此篇关于自研ORM框架实现类似EFCoreInclude拆分查询支持自定义条件、排序、选择的文章就讲到这里了,如果你想了解更多关于自研ORM框架实现类似EFCoreInclude拆分查询支持自定义条件、排序、选择的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!