首页 > 其他分享 >超轻量的Orm工具

超轻量的Orm工具

时间:2024-09-28 17:13:01浏览次数:3  
标签:UserId Db Orm a5 USER 工具 轻量 ID SELECT

简介

无任何依赖项的轻量级的Orm工具,只负责解析Expression,然后拼接成Sql语句。除去使用生成器生成的多个泛型的扩展类型,代码行数约为5000。使用Expression动态构建类型映射。

安装

dotnet add package MT.LightORM --version 2.1.5-pre

注册和配置

// IServiceCollection
services.AddLightOrm(option => {
	option.SetDatabase(DbBaseType, ConnectionString, DbProviderFactory);
})
// 直接使用
var path = Path.GetFullPath("../../../test.db");
ExpSqlFactory.Configuration(option =>
{
    option.SetDatabase(DbBaseType.Sqlite, "DataSource=" + path, SQLiteFactory.Instance);
    option.SetTableContext(new TestTableContext());
    option.SetWatcher(aop =>
    {
        aop.DbLog = (sql, p) =>
        {
            Console.WriteLine(sql);
        };
    });//.InitializedContext<TestInitContext>();
});
IExpressionContext Db = ExpSqlFactory.GetContext();

使用生成器(可选)

用途

用于收集实体类型信息,以及创建读写值的方法

使用

// 创建一个partial class, 例如 TestTableContext
// 标注`LightORMTableContext`Attribute
[LightORMTableContext]
public partial class TestTableContext
{

}
// 在配置的时候应用
option.SetTableContext(new TestTableContext());

查询(示例代码中使用的Db均为IExpressionContext对象)

基础查询

Db.Select<Product>()
    .Where(p => p.ModifyTime > DateTime.Now)
    .ToSql(p => new { p.ProductId, p.ProductName });
SELECT `a1`.`ProductId`, `a1`.`ProductName`
FROM `Product` `a1`
WHERE ( `a1`.`ModifyTime` > @Now_0 )

Join查询

Db.Select<User>()
	.InnerJoin<UserRole>(w => w.Tb1.UserId == w.Tb2.UserId)
	.InnerJoin<Role>(w => w.Tb2.RoleId == w.Tb3.RoleId)
	.Where(u => u.UserId == "admin")
	.ToSql(w => w.Tb1);
SELECT `a5`.*
FROM `USER` `a5`
INNER JOIN `USER_ROLE` `a6` ON ( `a5`.`USER_ID` = `a6`.`USER_ID` )
INNER JOIN `ROLE` `a2` ON ( `a6`.`ROLE_ID` = `a2`.`ROLE_ID` )
WHERE ( `a5`.`USER_ID` = @Const_0 )

多表查询

Db.Select<Power, RolePower, Role>()
    .Distinct()
    .Where(w => w.Tb1.PowerId == w.Tb2.PowerId && w.Tb2.RoleId == w.Tb3RoleId)
    .ToSql(w => new { w.Tb1 });
SELECT DISTINCT `a0`.*
FROM `POWERS` `a0`, `ROLE_POWER` `a3`, `ROLE` `a2`
WHERE ( ( `a0`.`POWER_ID` = `a3`.`POWER_ID` ) AND ( `a3`.`ROLE_ID` = `a2`.`ROLE_ID` ) )

子查询

Db.Select<User>().Where(u => u.Age > 10).GroupBy(u => new
    {
        u.UserId
    }).AsTempQuery(u => new
    {
        u.Group.UserId,
        Total = u.Count()
    })
    .Where(t => t.UserId.Contains("admin"))
    .ToSql();
SELECT *
FROM (
    SELECT `a5`.`USER_ID` AS `UserId`, COUNT(*) AS `Total`
    FROM `USER` `a5`
    WHERE ( `a5`.`AGE` > 10 )
    GROUP BY `a5`.`USER_ID`
) `temp0`
WHERE `temp0`.`UserId` LIKE '%'||@Const_0||'%'

Join 子查询

Db.Select<User>()
    .LeftJoin(Db.Select<Product>().GroupBy(p => new { p.ProductId })ToSelect(g => new
    {
        g.Group.ProductId,
        Total = g.Count()
    }), (u, j) => u.Age == j.ProductId)
    .Where(w => w.Tb2.Total > 10)
    .ToSql();
SELECT *
FROM `USER` `a5`
LEFT JOIN (
    SELECT `a1`.`ProductId`, COUNT(*) AS `Total`
    FROM `Product` `a1`
    GROUP BY `a1`.`ProductId`
) `temp0` ON ( `a5`.`AGE` = `temp0`.`ProductId` )
WHERE ( `temp0`.`Total` > 10 )

With (tempName) AS (...) 查询

var tempU = Db.Select<User>().GroupBy(u => new { u.UserId }).ToSelect(g => new
{
    g.Group.UserId,
    Total = g.Count()
}).AsTemp("us");

var tempR = Db.Select<Role>().WithTempQuery(tempU)
    .Where((r, u) => r.RoleId == u.UserId)
    .Where(w=> w.Tb2.UserId.StartsWith("ad"))
    .AsTemp("temp",w=>new
    {
        w.Tb1.RoleId,
        w.Tb2.UserId,
    });

var sql = Db.Select<Power>().WithTempQuery(tempU, tempR)
    .Where(w => w.Tb2.Total > 10 || w.Tb3.UserId.Contains("admin"))
    .ToSql();
WITH us AS (
    SELECT `a5`.`USER_ID` AS `UserId`, COUNT(*) AS `Total`
    FROM `USER` `a5`
    GROUP BY `a5`.`USER_ID`
)
,temp AS (
    SELECT `a2`.`ROLE_ID` AS `RoleId`, `temp0`.`UserId`
    FROM `ROLE` `a2`, `us` `temp0`
    WHERE ( `a2`.`ROLE_ID` = `temp0`.`UserId` ) AND `temp0`.`UserId` LIKE @temp_Const_0||'%'
)
SELECT *
FROM `POWERS` `a0`, `us` `temp0`, `temp` `temp1`
WHERE ( ( `temp0`.`Total` > 10 ) OR `temp1`.`UserId` LIKE '%'||@Const_0||'%' )

Include查询

需要配置导航关系

Db.Select<User>()
    .Where(u => u.UserRoles.When(r => r.RoleId.StartsWith("ad")))
    .ToSql();
SELECT DISTINCT *
FROM `USER` `a5`
LEFT JOIN `USER_ROLE` `a6` ON ( `a5`.`USER_ID` = `a6`.`USER_ID` )
LEFT JOIN `ROLE` `a2` ON ( `a2`.`ROLE_ID` = `a6`.`ROLE_ID` )
WHERE `a2`.`ROLE_ID` LIKE @Const_0||'%'

Union 查询

已有查询Union新的查询

Db.Select<User>().Union(Db.Select<User>())
    .Where(u => u.Age > 10)
    .ToSql();
SELECT *
FROM (
    SELECT *
    FROM `USER` `a5`
    UNION
    SELECT *
    FROM `USER` `a5`
) `a5`
WHERE ( `a5`.`AGE` > 10 )

使用IExpressionContext.Union

Db.Union(Db.Select<User>(), Db.Select<User>())
    .Where(u => u.Age > 10)
    .ToSql();
SELECT *
FROM (
    SELECT *
    FROM `USER` `a5`
    UNION
    SELECT *
    FROM `USER` `a5`
) `a5`
WHERE ( `a5`.`AGE` > 10 )

更新

实体更新

根据配置的主键更新实体,并且忽略null值

Db.Update(p).ToSql();
UPDATE `Product` SET
`CategoryId` = @CategoryId,
`ProductCode` = @ProductCode,
`ProductName` = @ProductName,
`DeleteMark` = @DeleteMark,
`CreateTime` = @CreateTime,
`Last` = @Last
WHERE `ProductId` = @ProductId

指定列更新

Db.Update<Product>()
    .UpdateColumns(() => new { p.ProductName, p.CategoryId })
    .Where(p => p.ProductId > 10)
    .ToSql()
UPDATE `Product` SET
`CategoryId` = @CategoryId,
`ProductName` = @ProductName
WHERE ( `ProductId` > 10 )

忽略列更新

Db.Update(p)
    .IgnoreColumns(p => new { p.ProductName, p.CategoryId })
    .ToSql();
UPDATE `Product` SET
`ProductCode` = @ProductCode,
`DeleteMark` = @DeleteMark,
`CreateTime` = @CreateTime,
`Last` = @Last
WHERE `ProductId` = @ProductId

批量更新

插入

实体插入

Db.Insert(p).ToSql();
INSERT INTO `Product` 
(`ProductId`, `CategoryId`, `ProductCode`, `ProductName`, `DeleteMark`, `CreateTime`, `Last`) 
VALUES 
(@ProductId, @CategoryId, @ProductCode, @ProductName, @DeleteMark, @CreateTime, @Last)

批量插入

删除

Ado对象

直接执行sql语句, 可返回IEnumerable<T>,DataTable,DataReader等等

待办

标签:UserId,Db,Orm,a5,USER,工具,轻量,ID,SELECT
From: https://www.cnblogs.com/marvelTitile/p/18438162

相关文章

  • Java反射机制的原理、核心类、实际应用、优缺点、具体工具类BeanUtils。
    小二,来客人了客官有请:文章目录1.什么是Java反射机制?2.反射的核心类有哪些?3.使用反射前的准备......
  • DCDC电源设计工具(软件)(一)—— WEBENCH(TI)
    目录一、简介二、在线链接三、设计界面介绍1、首界面2、芯片选择或芯片选型界面3、根据参数选择芯片及设计(1)参数输入界面(2)芯片选型界面(3)根据具体芯片型号选择设计   ①、芯片选择及参数输入界面        ②、TPS54331电源设计详情四、验证设计五、软......
  • 第五:APP弱网测试工具(QNET)
    一.目前在测试移动设备上进行弱网络专项测试的方案主要有两种1.通过Android设备连接到PC上进行弱网络测试1.1.比如Fiddler,Charles,NET-Simulator等1.2.基本思路是在PC上装个Fiddler网络抓包工具1.3.然后再将Android设备的网络代理到PC上1.4.通过在PC上的Fiddler在设置......
  • huggingface的transformers与datatsets的安装与使用
    目录1.安装 2.分词2.1tokenizer.encode() 2.2tokenizer.encode_plus ()2.3tokenizer.batch_encode_plus() 3.添加新词或特殊字符 3.1tokenizer.add_tokens()3.2 tokenizer.add_special_tokens() 4.datasets的使用4.1加载datasets 4.2从dataset中取数据  4.3对datas......
  • 项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持
    若该文为原创文章,转载请注明出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142454993长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…Qt开发专栏:项目实战......
  • Android SDK工具(SDK Manager)下载与配置安装(测试环境搭建)
    文章目录一、前言二、下载三、SDKManager1.SDKTools2.SDKPlatformTools3.SDKBuildTools4.Adroid系统四.环境配置1.ANDROID_HOME设置2.Path配置3.验证配置一、前言在安卓开发和测试中,AndroidSDK起着关键作用。如今,AndroidStudio已将AndroidSDK合并......
  • AIGC基础工具-用于数据分析和数据处理的核心库Pandas介绍
    文章目录1.Pandas的核心数据结构1.1Series创建`Series`Series重要属性示例1.2DataFrame创建`DataFrame`DataFrame重要属性示例2.Pandas数据的导入与导出2.1读取CSV文件2.2读取Excel文件2.3写入CSV文件2.4读取JSON文件3.Pandas的数据操作3.1......
  • AIGC基础工具-科学计算和数据处理的重要库NumPy(Numerical Python)简介
    文章目录1.NumPy的核心概念1.1`ndarray`:多维数组对象示例代码2.NumPy的数据类型(`dtype`)示例代码3.NumPy的数组创建方法3.1使用`array()`创建数组3.2使用`zeros()`和`ones()`3.3使用`arange()`和`linspace()`3.4使用`random`模块生成随机数......
  • 书生大模型实战(从入门到进阶)L2-茴香豆:企业级知识库问答工具
    目录茴香豆介绍 茴香豆本地标准版搭建 环境搭建配置服务器:搭建茴香豆虚拟环境:安装茴香豆下载茴香豆 安装茴香豆所需依赖下载模型文件更改配置文件知识库创建测试知识助手命令行运行GradioUI界面测试本文是对书生大模型L2-茴香豆:企业级知识库问答工具部分......
  • transformer 从零
    transformer从零trm在做什么事情?类比“翻译”,输入、黑盒处理、输出。对其细化,黑盒中编码作为解码的输入,二者的结果作为终局输出的输入。继续细化成下图:位置编码下图为rnn下的时间线展开,借由三角函数性质公式:得到:即,若当pos=“我”,k=“爱”时,pos+k的“你”位置的向量......