[LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性
目录
- [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询
- [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询
- [LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射
- [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用
- [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL
- [LINQ2Dapper]最完整Dapper To Linq框架(六)---多表联合与匿名类型返回
- [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式
- [LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性
3.1.9.4版本增加新功能导航属性
1.安装
可在Nuget上搜索最新版本(目前是预览版本,只能通过Nuget命令安装)
或者使用Nuget命令
Install-Package Kogel.Dapper.Extension.Mssql 3.1.9.7
(此版本不建议正式项目使用)
2.定义
使用特性ForeignKey定义主外键关系
[Display(Rename = "News")]
public class News:IBaseEntity<News,int>
{
/// <summary>
/// 新闻主键
/// </summary>
[Identity]
public override int Id { get; set; } /// <summary>
/// 内容
/// </summary>
public string Content { get; set; } /// <summary>
/// 评论列表
/// </summary>
[ForeignKey("Id", "ArticleId")]
public List<Comment2> Comments { get; set; }
}
[Display(Rename = "Comment")]
public class Comment : IBaseEntity<Comment,int>
{
[Identity]
public override int Id { get; set; }
/// <summary>
/// 新闻id
/// </summary>
public int ArticleId { get; set; }
/// <summary>
/// 评论内容
/// </summary>
public string Content { get; set; }
}
注意:用到导航属性的实体类需要继承IBaseEntity,最好所有实体类都继承IBaseEntity
(在没有用到导航属性时,导航属性不会起任何作用,查询时也不会返回导航属性数据)
使用导航属性进行条件判断查询
var comment = conn.QuerySet<News1>()
.Where(x => x.Comments.Any(y => y.Id != ))
.ToList();
查询导航属性的数据,并使用Select
var comment11 = conn.QuerySet<News>()
.Where(x => x.Comments.Any(y => y.Id != ))
.Get(x => new NewsDto1
{
Id = x.Id,
Title = x.Content,
CommentDto1 = x.Comments.Select(y => new CommentDto1()
{
Id = y.Id,
Content = y.Content
}).ToList()
});
自定义返回的Dto类需要继承IBaseEntity接口
//需要继承IBaseEntity接口
public class CommentDto1:IBaseEntityDto
{
public int Id { get; set; }
public string Content { get; set; }
}
3. 1对1导航关系
public class Comment : IBaseEntity<Comment,int>
{
[Identity]
public override int Id { get; set; } /// <summary>
/// 内容
/// </summary>
public string Content { get; set; } /// <summary>
/// 新闻id
/// </summary>
public int ArticleId { get; set; } //一条评论对应一条新闻
[ForeignKey("ArticleId","Id")]
public News News { get; set; } }
1对1使用导航属性查询
var comment = conn.QuerySet<Comment>()
.Where(x => x.News.Id == )
.Get();
4.关于导航属性的性能
导航属性的实现是基于1对多或多对多直接关系的连表然后查询出所有主从结果,再利用“回溯二叉树算法”分割数据对应实体之间的关系进行实现
回溯法有通用解法的美称,实际上是一个类似枚举的深度优先收索参试过程,主要是在收索参试过程中寻找问题的解,当发现已不满足求解条件时就回溯返回也就是递归返回,参试别的路径。就是穷举法。
要解决一个回溯问题通常要确定三个元素:
1.选择:对于每一个特定的解,肯定是由一步步构建而来的,而每一步怎么构建,肯定都是有限个选择要怎么选择这个要知道在编程的时候就要定下优先或合法的每一步选择的顺序。
2.条件。对于每一个特定的解的某一步,他必然要符和某个解的特定要求,如果不符合条件,就要回溯。
3.结束。当到达一个特定结束条件的时候,就认为这个一步步构建的解是符合的解了
对于回溯法来说每次递归调用很重要的一点就是把每次递归的不同信息传递给递归调用的函数,最重要的就是把上一步做过的某些事情的这个选择排除避免重复和无限递归。
递归函数参数的选择需要遵循四个原则:
1.必须有一个临时变量因为每一步选择后暂时还没有构成完整的解,这个时候这个选择的不完整的解,也要想办法传递给递归函数,也就是,把每次递归的不同情况传递给递归调用的函数
2.最重要的是在参数设计中可以得到结束条件。
3.要保证递归函数返回时,状态可以恢复到递归前。
框架开源,完整框架源码可以去Github上下载:
https://github.com/a935368322/Kogel.Dapper.Extension
如有问题也可以加QQ群讨论:
技术群 710217654
[LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性的更多相关文章
- [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询
此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper 支持.net framework4.5.1 ...
- [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- [LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射
此特性需要安装Kogel.Dapper.Mssql或者Oracle 3.06及以上版本,实体类层需要安装Kogel.Dapper.Extension 3.06及以上版本 目录 [LINQ2Dapper ...
- [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL
此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper支持.net framework4.6.1及 ...
- [LINQ2Dapper]最完整Dapper To Linq框架(六)---多表联合与匿名类型返回
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- EntityFramework、Dapper vs 草根框架性能
EntityFramework.Dapper vs 草根框架性能 扯淡 当前市面上 ORM 很多,有跑车型的,如 Dapper,有中规中矩型的,如 Mybatis.Net,也有重量型的,如 Entit ...
- .NET深入解析LINQ框架2
1].开篇介绍 在开始看本篇文章之前先允许我打断一下各位的兴致.其实这篇文章本来是没有打算加“开篇介绍”这一小节的,后来想想还是有必要反馈一下读者的意见.经过前三篇文章的详细讲解,我们基本上对LINQ ...
随机推荐
- @atcoder - AGC035F@ Two Histograms
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N*M 的方格,我们通过以下步骤往里面填数: (1)将 ...
- Streamy障碍一:大批量条目
- @bzoj - 5219@ [Lydsy2017省队十连测]最长路径
目录 @description@ @solution@ @accepted code@ @details@ @description@ 在Byteland一共有n个城市,编号依次为1到n,形成一个n个 ...
- @bzoj - 4382@ [POI2015] Podział naszyjnika
目录 @description@ @solution@ @accepted code@ @details@ @description@ 长度为 n 的一串项链,每颗珠子是 k 种颜色之一. 第 i 颗 ...
- 从浏览器的url中获取查询字符串的参数
正则表达式: function getQuery(name){ var reg = new RegExp("(^|&)" + name + "=([^&] ...
- mysql 第三课 jdbc基础操作
jdbc连接可以大致分为5步: 1.注册驱动 2.获取连接 3.编写语句 4.执行语句 5.关闭连接 其中可以设置参数等等. 1.我们先建一个项目目录: 其中com.etc.dao为数据访问对象 co ...
- Python--day41--线程池--python标准模块concurrent.futures
1,线程池代码示例:(注:进程池的话只要将以下代码中的ThreadPoolExecutor替换成ProcessPoolExecutor即可,这里不演示) import time from concur ...
- 符合阿里巴巴代码规范的checkstyle检测文件
一.安装与简介 eclipse和idea都有对应的插件,找到插件安装界面.搜索checkstyle,点击安装后,重启IDE即可.(网上有很多安装教程,就不重复制造轮子了) 二.导入配置文件 在chec ...
- 2018-3-7-VisualStudio-csproj-添加-ItemGroup-的-Service-
title author date CreateTime categories VisualStudio csproj 添加 ItemGroup 的 Service lindexi 2018-3-7 ...
- CCPC2018 桂林 G "Greatest Common Divisor"(数学)
UPC备战省赛组队训练赛第十七场 with zyd,mxl G: Greatest Common Divisor 题目描述 There is an array of length n, contain ...