netcore.ydal可能是东半球最好ORM框架
typora-copy-images-to: static
ydal
项目框架介绍
可能是东半球最好netcore ORM框架,目前暂时支持mysql、mssql,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码,开箱即用。
It may be the best NETCORE ORM framework in the eastern hemisphere. At present, it temporarily supports MySQL and MSSQL, and its core design goal is to open
特此声明
重复造轮子仅为netcore开源贡献自己一份力量,让用户在orm框架上多一份选择,可以免费商用并提供永久技术支持
使用步骤
安装dll
Install-Package ydal
Install-Package YDal.CodeGenerator
也可以使用nuget管理客户端进行安装

注入代码
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services
.AddDal()//类库核心功能
.AddDalCodeGenerator();//代码生成器专用,生成框架代码之后请注释这段代码AddDalCodeGenerator;
}
生成框架代码配置
{
//连接数据库专用
"ConnectionStrings": {
"DefaultConnection": "server=localhost;uid=root;pwd=123456;port=3306;database=test;sslmode=Preferred;",
"DbType": "MySQL" //无此配置,默认mysql
}
//mssql连接字符串 Data Source=192.168.1.110;Initial Catalog=test;Persist Security Info=True;User ID=test;Password=123456;MultipleActiveResultSets=True;App=EntityFramework;
//代码生成器插件使用
"DbOption": {
"ConnectionString": "server=localhost;uid=root;pwd=123456;port=3306;database=test;sslmode=Preferred;",
"DbType": "MySQL", //mssql mysql
"Author": "作者名称",
"OutputPath": "F:\\app\\y-dal\\cs", //生成代码路径
"ModelsNamespace": "Samples.Models", //实体命名空间
"IRepositoryNamespace": "Samples.Repository", //仓储接口命名空间
"RepositoryNamespace": "Samples.Repository.Impl", //仓储命名空间
"IServicesNamespace": "Samples.Services", //服务接口命名空间
"ServicesNamespace": "Samples.Services.Impl", //服务命名空间
"Tables":"" //指定表名生成,多个用逗号隔开,为空全部
}
}
测试
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Samples.Models;
using Samples.Repository;
namespace Samples.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private IdemoRepository DemoRepostiory1;
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger, IdemoRepository DemoRepostiory)
{
_logger = logger;
this.DemoRepostiory1 = DemoRepostiory;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
DemoRepostiory1.Insert(new demo { UserName = "明哥富婆" });
Console.WriteLine($"{DemoRepostiory1.GetHashCode()}");
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}
API使用
支持以下2种写法,根据自身需要选择其中一种即可,以下所有代码查看源码UnitTest项目
lambda
xxxRepository.Where(f=>f.Id==123);
Linq:
from a in xxxRepository
1、where (条件查询)
①简单使用
var order1 = _orderdetailRepository.Entities.Where(f => f.itemid == 123)
.Select(f => new
{
f.itemid
})
.FirstOrDefault();
var order1 = _orderdetailRepository.Filter(f => f.itemid == 123);
排序从小到大
var order1 = _orderdetailRepository.Filter(f => f.orderid == 1, p => p.OrderBy(f => f.Id));
排序从大到小
var order1 = _orderdetailRepository.Filter(f => f.orderid == 1, p => p.OrderByDescending(f => f.Id));
多个字段排序
var order1 = _orderdetailRepository.Filter(f => f.orderid == 1, p => p.OrderBy(f => f.Id).ThenBy(f=>f.itemid));
②多个条件
var order1 = _orderdetailRepository.Filter(f => f.itemid == 123 && f.orderid == 1);
③多个表关联
var order1 = from a in _orderdetailRepository.Entities
join b in _ordermasterRepository.Entities on a.orderid equals b.Id
select new
{
b.paytime,
a.totalprice,
a.itemid,
};
2、select(映射)
①匿名对象
var order1 = _orderdetailRepository.Entities.Where(f => f.itemid == 123)
.Select(f => new
{
f.itemid
})
.FirstOrDefault();
②自定义对象
public class Test
{
public string itemname04 { get; set; }
public int itemid04 { get; set; }
}
var order1 = _orderdetailRepository.Entities.Where(f => f.itemid == 123)
.Select(f => new test
{
f.itemid
})
.FirstOrDefault();
3、update (更新)
①简单更新(不推荐)
var order1 = _orderdetailRepository.FilterWithTracking(f => f.itemid == 123);
order1.totalprice = 30.01M;
var r= _orderdetailRepository.Update(order1);
②sql语法糖更新(强烈推荐)
var r=_orderdetailRepository.Update(f => f.itemid == 123, f => new Orderdetail
{
totalprice = 32.01M
});
4、delete (删除)
① 简单删除(不推荐)
var order1 = _orderdetailRepository.FilterWithTracking(f => f.itemid == 9990);
var r = _orderdetailRepository.Delete(order1);
② sql语法糖更新(强烈推荐)
var r = _orderdetailRepository.Delete(f => f.itemid == 9990);
5、insert (插入)
①、简单插入
var r = _orderdetailRepository.Insert(new Orderdetail
{
itemid = 111115,
itemname = "测试insert",
totalprice = 111,
orderid = 1,
});
② 批量插入
var itemId = new Random().Next(100000, 999999);
var list = new List<Orderdetail>();
for (int i = 0; i < 10; i++)
{
list.Add(new Orderdetail
{
itemid = itemId,
itemname = "测试插入",
totalprice = 111,
orderid = 1,
});
};
var r = _orderdetailRepository.Insert(list);
6、page分页 (分页)
①无条件单表分页
var page = new PagingInfo
{
PageIndex = 2, //当前页
PageSize = 5,//每页条数
};
var result = _orderdetailRepository.GetListByPage(page);
var totalCount = result.TotalCount;//返回总页数
② 有条件单表分页
var page = new PagingInfo
{
PageIndex = 2, //当前页
PageSize = 5,//每页条数
};
var result = _orderdetailRepository.Entities.Where(f => f.Id > 10).Paging(page);
③ 支持匿名对象分页
var page = new PagingInfo
{
PageIndex = 1, //当前页
PageSize = 5,//每页条数
};
var result = _orderdetailRepository.Entities
.Where(f => f.Id > 10)
.Select(p => new
{
p.itemid,
p.itemname
})
.Paging(page);
④ 支持自定义对象分页
var page = new PagingInfo
{
PageIndex = 1, //当前页
PageSize = 5,//每页条数
};
var result = _orderdetailRepository.Entities
.Where(f => f.Id > 10)
.Select(p => new Test
{
itemid04 = p.itemid,
itemname04 = p.itemname
})
.Paging(page);
⑤多表分页
var page = new PagingInfo
{
PageIndex = 2, //当前页
PageSize = 5,//每页条数
};
var query = from a in _orderdetailRepository.Entities
join b in _ordermasterRepository.Entities on a.orderid equals b.Id
select new
{
b.paytime,
a.totalprice,
a.itemid,
};
var result = query.Paging(page);
问题反馈
可以直接进群反馈:916213430
netcore.ydal可能是东半球最好ORM框架的更多相关文章
- Mego(03) - ORM框架的新选择
前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...
- Orm框架(AntOrm,Ktorm)在mac机器上如何使用代码生成
Orm框架介绍 AntOrm 是我维护的一个开源csharp -netcore 项目 Ktorm 是一个大神开源的kotlin项目 由于我工作上都用到了,为了提高工作效率 我写了一个mac端工具帮助快 ...
- EF 太重,MyBatis 太轻,ORM 框架到底怎么选 ?
以 EF 为代表的基于 Linq 的 ORM 框架总是 很重. 他们的功能早已超出了一个 ORM 的范畴, ORM 是 Object Relational Mapping ,从名字上看,其初衷是将 数 ...
- ORM框架对分表分库的实现
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- 记SqlSugar ORM框架之找不到主键问题
前端时间在.NetCore项目中使用SqlSugar ORM框架(引用sqlSugarCore依赖包)的时候遇到了一个奇葩问题:对表进行数据更新操作的时候,报错 “ You cannot have n ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- 最好的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- [Android]Android端ORM框架——RapidORM(v2.1)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...
- [Android]Android端ORM框架——RapidORM(v2.0)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...
随机推荐
- kettle如何从cube抽数据
接触kettle已经还是有一段时间了,但是一直都使用简单的输入.输出(二维数据库to二维数据库).今天,突然接到一个需求,需要从多维数据库(CUBE)里面将数据抽取到二维数据库,我难住了,不知道该如何 ...
- 【运行机制】 JavaScript的事件循环机制总结 eventLoop
0.从个例子开始 //code-01 console.log(1) setTimeout(() => { console.log(2); }); console.log(3); 稍微有点前端经验 ...
- AcWing 400. 太鼓达人
大型补档计划 题目链接 神仙题.考虑转为图论模型. 若以 \(2 ^ k\) 个点,相互转化,很容易看出要求一个哈密尔顿环,显然对于 \(1000\) 规模的数据求不出来. 对于图论中环的算法,并且能 ...
- STL——容器(Map & multimap)的大小
1. Map & multimap 的大小 map.size(); //返回容器中元素的数目 map.empty();//判断容器是否为空, 容器中有内容将会返回 false 代码示例 ...
- C++ 虚函数表与多态 —— 虚函数表的内存布局
C++面试经常会被问的问题就是多态原理.如果对C++面向对象本质理解不是特别好,问到这里就会崩. 下面从基本到原理,详细说说多态的实现:虚函数 & 虚函数表. 1. 多态的本质: 形 ...
- Python命令行模块(sys.argv,argparse,click)
Python作为一门脚本语言,经常作为脚本接受命令行传入参数,Python接受命令行参数大概有三种方式.因为在日常工作场景会经常使用到,这里对这几种方式进行总结. 命令行参数模块 这里命令行参数模块平 ...
- x64架构下Linux系统函数调用
原文链接:https://blog.fanscore.cn/p/27/ 一. 函数调用相关指令 关于栈可以看下我之前的这篇文章x86 CPU与IA-32架构 在开始函数调用约定之前我们需要先了解一下几 ...
- Salesforce LWC学习(二十九) getRecordNotifyChange(LDS拓展增强篇)
本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/data_ui_api https ...
- js下 Day20、综合案例
一.购物车 效果图: 功能思路分析: 1. 面向对象框架 2. 模拟数据 1.多个店铺数组套对象 2.每个店铺多个商品,数组套对象
- [打基础]luogu2181对角线——计数原理
啦啦啦我ysw又回来啦!之后大概会准备打acm,暑假尽量复习复习,因为已经快两年没碰oi了,最多也就高三noip前学弟学妹出题讲题,所以从这一篇blog开始大概会有一系列"打基础" ...