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 ...
随机推荐
- PyQt(Python+Qt)学习随笔:formLayout的layoutFieldGrowthPolicy属性
Qt Designer的表单布局(formLayout)中,layoutFieldGrowthPolicy用于控制表单布局中输入部件大小的增长方式.如图: 该字段实际与QFormLayout类的Fie ...
- js 转换为字符串方法
要把一个值转换为一个字符串有两种方法:toString()方法和转型函数String(). toString()方法 数值.布尔值.对象.字符串值(每个字符串都有一个toString()方法,该方法返 ...
- 微软面试题:剑指 Offer 51. 数组中的逆序对 Hard 出现次数:3
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. 输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...
- 懒松鼠Flink-Boot(Flink+Spring):一款将Flink与Spring生态完美融合的脚手架工程
目录 你可能面临如下苦恼: 接口缓存 重试机制 Bean校验 等等...... 它为流计算开发工程师解决了 有了它你的代码就像这样子: 仓库地址:懒松鼠Flink-Boot 1. 组织结构 2. 技术 ...
- Panda Global 要点聚焦,区块链在数字医疗的落地应
据Panda Global,随着区块链技术影响力的不断扩大,其应用性已涉及更加广泛的领域,不断更新着人们的认知.在区块链技术未介入之前,关于医疗行业和数字经济结合早已不是什么新鲜话题,相关研究不少 但 ...
- OpenResty&Canal
OpenResty&Canal OpenResty 提供缓存功能 封装了Nginx,并且提供了Lua扩展,大大提升了Nginx的并发处理能力10k~1000k Nginx限流 1.控制速率 2 ...
- uwsgi 的app变量名称必须为application
from myproject import app as application if __name__ == "__main__": application.run() 否则会提 ...
- 移动端 canvas基础1
一.canvas画布 Canvas是HTML5中新出的一个元素,开发者可以通过JS脚本动态绘制图像. #1. 创建canvas画布 在页面中创建canvas标签,并设置其id和宽高 (不要通过css设 ...
- LightningChart -XY 2D图表特性
LightningChart -XY 2D图表--2D图表 系列类型:抽样数据(离散数据).点线.任意形式的点线.面积.高低.多边形.股票系列(蜡烛图).条.带.恒定线.强度网格和强度网强度系列能够渲 ...
- Python基础入门:注释、变量、运算符与数据类型
一.为什么要学习python? python的特点 python作为一门脚本语言,在越来越多的行业和领域发挥着重大作用,比如机器学习.网站开发.数据分析.爬虫.自动化测试. 同时,python具备以下 ...