目录

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框架(八)---导航属性的更多相关文章

  1. [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  2. [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询

    此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper 支持.net framework4.5.1 ...

  3. [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  4. [LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射

    此特性需要安装Kogel.Dapper.Mssql或者Oracle 3.06及以上版本,实体类层需要安装Kogel.Dapper.Extension 3.06及以上版本 目录 [LINQ2Dapper ...

  5. [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  6. [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL

    此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper支持.net framework4.6.1及 ...

  7. [LINQ2Dapper]最完整Dapper To Linq框架(六)---多表联合与匿名类型返回

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  8. EntityFramework、Dapper vs 草根框架性能

    EntityFramework.Dapper vs 草根框架性能 扯淡 当前市面上 ORM 很多,有跑车型的,如 Dapper,有中规中矩型的,如 Mybatis.Net,也有重量型的,如 Entit ...

  9. .NET深入解析LINQ框架2

    1].开篇介绍 在开始看本篇文章之前先允许我打断一下各位的兴致.其实这篇文章本来是没有打算加“开篇介绍”这一小节的,后来想想还是有必要反馈一下读者的意见.经过前三篇文章的详细讲解,我们基本上对LINQ ...

随机推荐

  1. Nacos Committer 张龙:Nacos Sync 的设计原理和规划

    图:Nacos Meetup @杭州 与你同行,抬头便是星空. 本文整理自Nacos Committer 张龙的现场分享,阿里巴巴中间件受权发布. 随着 Nacos 1.0.0 稳定版的发布,越来越多 ...

  2. @NOIP2018 - D2T3@ 保卫王国

    目录 @题目描述@ @题解@ @代码@ @题目描述@ Z 国有n座城市,n−1 条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市中驻 ...

  3. python环境测试MySQLdb、DBUtil、sqlobject性能

    python环境测试MySQLdb.DBUtil.sqlobject性能 首先介绍下MySQLdb.DBUtil.sqlobject: (1)MySQLdb 是用于Python连接Mysql数据库的接 ...

  4. deepin golang微服务搭建go-micro环境

    1.安装micro 需要使用GO1.11以上版本 #linux 下 export GO111MODULE=on export GOPROXY=https://goproxy.cn # 使用如下指令安装 ...

  5. Python基础10 回顾

    从最初的"Hello World",走到面向对象,该回过头来看看,教程中是否遗漏了什么. 我们之前提到一句话,"Everything is Object".那么 ...

  6. @hdu - 6427@ Problem B. Beads

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 m 种不同颜色的珠子,颜色分别为 1~m,每一种颜色的珠子有 ...

  7. laravel 学习笔记blog后台

    https://github.com/almasaeed2010/adminlte composer require "almasaeed2010/adminlte=~2.0"

  8. Java反射机制(二):通过反射取得类的结构

    在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类: · Constructor  表示类中的构造方法 · Field  表示类中的属性 · ...

  9. 洛谷P2590 [ZJOI2008]树的统计 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2590 树链剖分模板题. 剖分过程要用到如下7个值: fa[u]:u的父节点编号: dep[u]:u的深度: size[u]: ...

  10. Python--day62--编辑出版社功能

    1,Django项目主要用到的文件