.NET ORM框架SqlSugar实现导航查询功能

目录
  • 1、导航查询特点
    • 1.1 无外键开箱就用
    • 1.2 高性能优
    • 3.3 语法超级爽
  • 2、新导航查询 ORM
    • 2.1 一对一
    • 2.2 一对多
    • 2.3 多对多
    • 2.4 多级查询
    • 2.5 大数据分页导航
  • 3、ORM无配置映射(高性能)
    • 3.1 无配置映射实现二层
    • 3.2  无配置映射无限级
  • 4 、.NET ORM 未来计划
  • GitHUB 源码:

1、导航查询特点

作用:主要处理主对象里面有子对象这种层级关系查询

1.1 无外键开箱就用

其它ORM导航查询 需要 各种配置或者外键,而SqlSugar则开箱就用,无外键,只需配置特性和主键就能使用

1.2 高性能优

查询 性能非常强悍

支持大数据分页导航查询

3.3 语法超级爽

注意:多级查询时VS有时候没提示直接写就行了 ,相比 其他 .NET ORM语法要简单的多

var list=db.Queryable<Test>()
          .Includes(x => x.Provinces,x=>x.Citys ,x=>x.Street)//多级查询 有时候VS没提示手写
          .Includes(x => x.ClassInfo)// 一级查询
          .ToList();

       //多级查询  加排序过滤
       .Includes(x =>x.Provinces.Where(z=>z.Id>0).OrderBy(z=>z.Id).ToList(),x=>x.Citys,x=>x.Street)
        // 一级查询
       .Includes(x =>x.ClassInfo)
       .ToList();

2、新导航查询 ORM

适合有主键的常规操作, 请升级到5.0.6.8

2.1 一对一

//实体
        public class StudentA
        {
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int StudentId { get; set; }
            public string Name { get; set; }
            public int SchoolId { get; set; }
            [Navigate(NavigateType.OneToOne, nameof(SchoolId))]//一对一
            public SchoolA SchoolA { get; set; }

        }
        public class SchoolA
        {
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int SchoolId { get; set; }
            public string SchoolName { get; set; }
        }
//代码
 var list2 = db.Queryable<StudentA>()
           .Includes(x => x.SchoolA)
           .Where(x => x.SchoolA.SchoolName == "北大")//可以对一级导航进行过滤
           .ToList();

2.2 一对多

//实体
        public class StudentA
        {
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int StudentId { get; set; }
            public string Name { get; set; }
            public int SchoolId { get; set; }
            [Navigate(NavigateType.OneToOne, nameof(SchoolId))]//一对一
            public SchoolA SchoolA { get; set; }

        }
        public class SchoolA
            public string SchoolName { get; set; }
//代码
 var list2 = db.Queryable<StudentA>()
           .Includes(x => x.SchoolA)
           .Where(x => x.SchoolA.SchoolName == "北大")//可以对一级导航进行过滤
           .ToList();

2.3 多对多

//多对多
       public class ABMapping1
       {
            [SugarColumn(IsPrimaryKey = true )]
            public int AId { get; set; }
            [SugarColumn(IsPrimaryKey = true)]
            public int BId { get; set; }
        }
        public class A1
        {
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true  )]
            public int Id { get; set; }
            public string Name { get; set; }
            [Navigate(typeof(ABMapping1),nameof(ABMapping1.AId),nameof(ABMapping1.BId))]
            public List<B1> BList { get; set; }
        }
        public class B1
        {
            [SugarColumn(IsPrimaryKey = true , IsIdentity = true)]
            public int Id { get; set; }
            public string Name { get; set; }
            [Navigate(typeof(ABMapping1), nameof(ABMapping1.BId), nameof(ABMapping1.AId))]
            public List<A1> AList { get; set; }
        }
 //例1:简单用法
var list3= db.Queryable<A1>().Includes(x => x.BList).ToList(); 

 //例2:支持子对象排序和过滤
var list3= db.Queryable<A1>().Includes(x => x.BList.Where(z=>z.Id>0).ToList()).ToList(); 

 //例3:支持主表过滤  Any和Count
var list3= db.Queryable<A1>().Includes(x => x.BList)
                             .Where(x=>x.BList .Any(z=>z.Id ==1)).ToList();

2.4 多级查询

配置好实体类,我们可以多级查询 ,.NET 中轻松多级查询

var list=db.Queryable<Test>()
               .Includes(x => x.Provinces,x=>x.Citys ,x=>x.Street)//有时候没提示 直接写
               .Includes(x => x.ClassInfo)// 一级查询
               .ToList();

2.5 大数据分页导航

适合一次性查询1000条以上的导航

var list = new List<Tree1>();

  db.Queryable<Tree1>()
      .Includes(it => it.Child)
      .ForEach(it => list.Add(it), 300); //每次查询300条 

更多用法:https://www.donet5.com/Home/Doc?typeId=2414

3、ORM无配置映射(高性能)

适合没有主键或者复杂的一些操作

3.1 无配置映射实现二层

结构:  Student->SchoolA

var list = db.Queryable<StudentA>().ToList();
db.ThenMapper(list, stu =>
{
  //如果加Where不能带有stu参数,stu参数写到 SetContext
  stu.SchoolA=db.Queryable<SchoolA>().SetContext(scl=>scl.SchoolId,()=>stu.SchoolId,stu).FirstOrDefault();
});
// SetContext不会生成循环操作,高性能  和直接Where性能是不一样的

如果没有SetContext那么这个查询将会循环

3.2  无配置映射无限级

了解原理后我们用ThenMapper想映射哪层就映射哪层

var treeRoot=db.Queryable<Tree>().Where(it => it.Id == 1).ToList();
//第一层
db.ThenMapper(treeRoot, item =>
{
    item.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => item.Id, item).ToList();
});
//第二层
db.ThenMapper(treeRoot.SelectMany(it=>it.Child), it =>
{
    it.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => it.Id, it).ToList();
});
//第三层
db.ThenMapper(treeRoot.SelectMany(it => it.Child).SelectMany(it=>it.Child), it =>
{
    it.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => it.Id, it).ToList();
});
//这儿只是用树型结构来证明可以实现无限级别导航查询 ,实际开发中树型结构用ToTree实现
public class Tree
{
[SqlSugar.SugarColumn(IsPrimaryKey =true)]
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
[SqlSugar.SugarColumn(IsIgnore = true)]
public Tree Parent { get; set; }
[SqlSugar.SugarColumn(IsIgnore = true)]
public List<Tree> Child { get; set; }
}
// SetContext不会生成循环操作,高性能  和直接Where性能是不一样的

4 、.NET ORM 未来计划

Json to sql  正在开发中 ,未来将打造一套直接由前端操作数据库的API

{
"Queryable":"order",
 Select:[ [{SqlFunc_AggregateMin:["id"]},"id"], [{SqlFunc_GetDate:[]},"Date"] ]
}

将支持 权限过滤 ,验证,多表查询,层级导航查询 等  

GitHUB 源码:

https://github.com/donet5/SqlSugar

到此这篇关于.NET ORM框架SqlSugar实现导航查询功能的文章就介绍到这了,更多相关.NET ORM SqlSugar导航查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .net数据库操作框架SqlSugar的简单入门

    介绍 SqlSugar是一款 老牌 .NET数据库操作框架,由果糖大数据科技团队维护和更新 ,Github star数仅次于EF 和 Dapper 优点: 简单易用.功能齐全.高性能.轻量级.服务齐全.有专业技术支持一天18小时服务 支持数据库:MySql.SqlServer.Sqlite.Oracle . postgresql.达梦.人大金仓 框架新功能 最新稳定版本5.0.2.8 ,发布后1个月时间NUGET下载量达到5000的版本,用户使用也相当满意 而在稳定版本的基础上又布了5.0.2.

  • ASP.NET Core MVC中Form Tag Helpers用法介绍

    简介 我们已经介绍过Tag Helpers以及一些最常用的Tag Helpers,也谈到了缓存Tag Helpers.在这篇文章中,我们将讨论表单Tag Helpers. HTML或Web表单通过使用各种HTML元素用于收集来自用户的输入,如输入框.复选框.单选按钮.下拉列表等.使用 <form> 元素时,我们通常使用POST请求.虽然也可以使用GET请求,不过GET请求建议提交于少量.非敏感的数据来获取数据. ASP.NET Core MVC提供了一些Form Tag Helpers,让我们

  • .NET Orm性能测试分析

    简介 OrmBenchmark 这个项目主要是为了测试主要的Orm对于 SqlServer 数据库的查询并将数据转换成所需 POCO 对象的耗时情况(好吧,实际上不完全orm,更像是SqlMapper ...) 测试结果: .NetFramework 4.6 有预热 .NetFramework 4.6 没有预热 .NETCore2.0 有预热 .NETCore2.0 没有预热 总体来看, Dapper的性能还是蛮强悍的 更多详情: Net Framework Net Core 性能测试 性能测试

  • .NET ORM框架SqlSugar实现导航查询功能

    目录 1.导航查询特点 1.1 无外键开箱就用 1.2 高性能优 3.3 语法超级爽 2.新导航查询 ORM 2.1 一对一 2.2 一对多 2.3 多对多 2.4 多级查询 2.5 大数据分页导航 3.ORM无配置映射(高性能) 3.1 无配置映射实现二层 3.2  无配置映射无限级 4 ..NET ORM 未来计划 GitHUB 源码: 1.导航查询特点 作用:主要处理主对象里面有子对象这种层级关系查询 1.1 无外键开箱就用 其它ORM导航查询 需要 各种配置或者外键,而SqlSugar则

  • ssm框架+PageHelper插件实现分页查询功能

    通过搭建ssm框架,然后通过mybatis的分页插件pagehelp进行分页查询. 源码:https://gitee.com/smfx1314/pagehelper 看一下项目结构: 首先创建一个maven工程,pom中引入相关jar包 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId&

  • python轻量级orm框架 peewee常用功能速查详情

    目录 一.常见orm数据库框架 1.peewee 简单demo 二.Model 和 Field 关系 三.Model 模型 四.Filed 字段 1.字段初始化参数 2.字段特有参数 3.字段默认参数 4.索引 五.基本操作 增删改查 1.创建 2.删除 3.更新 4.查询 5.事务 6.过滤 7.记录分类 8.计数 9.分页 六.聚合查询 七.Scalar 八.窗口 九.复杂筛选 1.查询中支持的筛选运算符 2.筛选方法 3.联合查询逻辑操作 十.SQL 方法 1.SQL helper 2.安

  • ThinkPHP框架实现用户信息查询更新及删除功能示例

    本文实例讲述了ThinkPHP框架实现用户信息查询更新及删除功能.分享给大家供大家参考,具体如下: 一 代码 1.配置文件 <?php return array( 'APP_DEBUG' => false, // 关闭调试模式 'DB_TYPE'=> 'mysql', // 数据库类型 'DB_HOST'=> 'localhost', // 数据库服务器地址 'DB_NAME'=>'db_database30', // 数据库名称 'DB_USER'=>'root',

  • thinkPHP5框架实现分页查询功能的方法示例

    本文实例讲述了thinkPHP5框架实现分页查询功能的方法.分享给大家供大家参考,具体如下: controller文件内Admin.php <?php namespace app\admin\controller; use think\Controller; use app\admin\model\Admin as AdminModel; //使用分页类 取别名解决类名冲突 class Admin extends Controller{ public function lst(){ /* 分页开

  • ThinkPHP5框架实现简单的批量查询功能示例

    本文实例讲述了ThinkPHP5框架实现简单的批量查询功能.分享给大家供大家参考,具体如下: TP5的EXP.批量查询.聚合查询等. <!--more--> //使用EXP条件表达式,表示后面是原生的SQL表达式 $result = Db::table('think_inno')->where('id','exp',"<10 and name='asd'")->select(); dump($result); //使用and和or进行混合查询 $resul

  • flask的orm框架SQLAlchemy查询实现解析

    这篇文章主要介绍了flask的orm框架SQLAlchemy查询实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一对多,多对多是什么? 一对多.例如,班级与学生,一个班级对应多个学生,或者多个学生对应一个班级. 多对多.例如,学生与课程,可以有多个学生修同一门课,同时,一门课也有很多学生. 一对多查询 如果一个项目,有两张表.分别是班级表,学生表. 在设计数据表时,我们给学生表设置一个外键,指向班级表的 id . sqlalchemy

  • laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析

    本文实例讲述了laravel框架数据库操作.查询构建器.Eloquent ORM操作.分享给大家供大家参考,具体如下: 1.连接数据库 laravel连接数据库的配置文件位于config/database.php中,在其中connection字段中包含laravel所支持的数据库的配置信息,可以看到其中有主机.端口.数据库.用户名.密码等信息: 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'),

  • Python轻量级ORM框架Peewee访问sqlite数据库的方法详解

    本文实例讲述了Python轻量级ORM框架Peewee访问sqlite数据库的方法.分享给大家供大家参考,具体如下: ORM框架就是 object relation model,对象关系模型,用来实现把数据库中的表 映射到 面向对象编程语言中的类,不需要写sql,通过操作对象就能实现 增删改查. ORM的基本技术有3种: (1)映射技术 数据类型映射:就是把数据库中的数据类型,映射到编程语言中的数据类型.比如,把数据库的int类型映射到Python中的integer 类型. 类映射:把数据库中的

  • Laravel5中实现模糊匹配加多条件查询功能的方法

    本文实例讲述了Laravel5中实现模糊匹配加多条件查询功能的方法.分享给大家供大家参考,具体如下: 方法1. ORM模式 public function ReportAccurate($data) { if(is_array($data)) { $where = $this->whereAll($data); return $where; } else { return false; } } /*多条件模糊*/ public function whereAll($data) { $query

随机推荐