[LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性

送分小仙女□ 提交于 2020-11-22 07:34:09

目录

 

3.1.9.4版本增加新功能导航属性

1.安装

可在Nuget上搜索最新版本(目前是预览版本,只能通过Nuget命令安装

或者使用Nuget命令

Install-Package Kogel.Dapper.Extension.Mssql 3.1.9.6

 (此版本可能存在一些小坑,不建议正式项目使用)

 

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 != 10))
    .ToList();

查询导航属性的数据,并使用Select

var comment11 = conn.QuerySet<News>()
        .Where(x => x.Comments.Any(y => y.Id != 10))
        .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:IBaseEntity
{
    public  int Id { get; set; }
    public  string Content { get; set; }
    //实现返回主键id,Orm解析需要一个标识字段分割数据
    public object GetId()
    {
           return Id;
    }
}

 

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 == 1)
    .Get();

 

4.关于导航属性的性能

   导航属性的实现是基于1对多或多对多直接关系的连表然后查询出所有主从结果,再利用“回溯二叉树算法”分割数据对应实体之间的关系进行实现

   回溯法有通用解法的美称,实际上是一个类似枚举的深度优先收索参试过程,主要是在收索参试过程中寻找问题的解,当发现已不满足求解条件时就回溯返回也就是递归返回,参试别的路径。就是穷举法。

要解决一个回溯问题通常要确定三个元素:
  1.选择:对于每一个特定的解,肯定是由一步步构建而来的,而每一步怎么构建,肯定都是有限个选择要怎么选择这个要知道在编程的时候就要定下优先或合法的每一步选择的顺序。
  2.条件。对于每一个特定的解的某一步,他必然要符和某个解的特定要求,如果不符合条件,就要回溯。
  3.结束。当到达一个特定结束条件的时候,就认为这个一步步构建的解是符合的解了
对于回溯法来说每次递归调用很重要的一点就是把每次递归的不同信息传递给递归调用的函数,最重要的就是把上一步做过的某些事情的这个选择排除避免重复和无限递归。
递归函数参数的选择需要遵循四个原则:
  1.必须有一个临时变量因为每一步选择后暂时还没有构成完整的解,这个时候这个选择的不完整的解,也要想办法传递给递归函数,也就是,把每次递归的不同情况传递给递归调用的函数
  2.最重要的是在参数设计中可以得到结束条件。
  3.要保证递归函数返回时,状态可以恢复到递归前。

 

 

框架开源,完整框架源码可以去Github上下载:

https://github.com/a935368322/Kogel.Dapper.Extension

如有问题也可以加QQ群讨论:

技术群 710217654

 

原文出处:https://www.cnblogs.com/kogel/p/12143895.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!