目錄
介紹
支援的資料庫
如何使用
資料庫配置
使用方法
對象映射
子表映射
基本操作
資料聚合
Join表查詢
執行SQL
單元測試
性能測試
介紹
Light.Data 是一個基于dotnet standard 2.0的輕量級ORM架構 ,通過實體模型類 Attribute 或配置檔案關聯資料表。使用核心類 DataContext 在表上進行 CURD 操作。
PM> Install-Package Light.Data
支援的資料庫
資料庫 | 介紹 |
SqlServer的 | 需要安裝 nuget 安裝 Light.Data.Mssql 庫,支援SqlServer 2008或以上版本 |
Mysql的 | 需要安裝 nuget 安裝 Light.Data.Mysql 庫,支援Mysql5.5或以上版本 |
Postgre | 需要安裝 nuget 安裝 Light.Data.Postgre 庫,支援PostgreSQL9.3或以上版本 |
- 檔案:https://aquilahkj.github.io/Light.Data.Site/
- Github:https://github.com/aquilahkj/Light.Data2
如何使用
資料庫配置
{
"lightData": {
"connections": [
{
"name": "mssql_db",
"connectionString": "...",
"providerName": "Light.Data.Mssql.MssqlProvider, Light.Data.Mssql"
},
{
"name": "mysql_db",
"connectionString": "...",
"providerName": "Light.Data.Mysql.MysqlProvider, Light.Data.Mysql"
}
]
}
}
使用方法
// direct use
DataContext context = new DataContext("mssql");
// create subclass
public class MyDataContext : DataContext
{
public MyDataContext() : base("mssql")
{
}
}
// create subclass with options
public class MyDataContext : DataContext
{
public MyDataContext(DataContextOptions<MyDataContext> options) : base(options)
{
}
}
// direct config connect string and params (IServiceCollection)
service.AddDataContext<MyDataContext>(builder => {
builder.UseMssql(connectionString);
builder.SetTimeout(2000);
builder.SetVersion("11.0");
}, ServiceLifetime.Transient);
// use default configuration file to config (IServiceCollection)
service.AddDataContext<MyDataContext>(DataContextConfiguration.Global, config => {
config.ConfigName = "mssql";
}, ServiceLifetime.Transient);
對象映射
[DataTable("Te_User", IsEntityTable = true)]
public class TeUser
{
/// <summary>
/// Id
/// </summary>
/// <value></value>
[DataField("Id", IsIdentity = true, IsPrimaryKey = true)]
public int Id
{
get;
set;
}
/// <summary>
/// Account
/// </summary>
/// <value></value>
[DataField("Account")]
public string Account
{
get;
set;
}
/// <summary>
/// Telephone
/// </summary>
/// <value></value>
[DataField("Telephone", IsNullable = true)]
public string Telephone
{
get;
set;
}
....
}
子表映射
在派生類TeUserAndExtend中添加類型為TeUserExtend的公共屬性Extend,并添加特性RelationFieldAttribute。在查詢TeUserAndExtend中,還将檢測關聯的TeUserExtend 資料。并且還支援一對多。
[DataTable("Te_UserExtend", IsEntityTable = true)]
public class TeUserExtend
{
[DataField("Id", IsIdentity = true, IsPrimaryKey = true)]
public int Id
{
get;
set;
}
[DataField("MainId")]
public int MainId
{
get;
set;
}
[DataField("Data", IsNullable = true)]
public string Data
{
get;
set;
}
}
public class TeUserAndExtend : TeUser
{
[RelationField("Id", "MainId")]
public TeUserExtend Extend
{
get;
set;
}
}
基本操作
- 基本CURD
- 批量CUD
- 支援事務處理
- 支援資料字段預設值和自動時間戳
- 支援資料字段讀寫控制
- 查詢結果指定類或匿名類輸出
- 查詢結果直接插入資料表
var context = new DataContext();
// query single data
var item = context.Query<TeUser>().Where(x => x.Id == 10).First();
// query collection datas
var list = context.Query<TeUser>().Where(x => x.Id > 10).ToList();
// create date
var user = new TeUser() {
Account = "foo",
Password = "bar"
};
context.Insert(user);
// update data
user.Password = "bar1";
context.Update(user);
// delete data
context.Delete(user);
資料聚合
- 單列資料直接聚合
- 多列資料分組聚合
- 格式化分組字段
- 聚合資料直接插入資料表
// basic
var list = context.Query<TeUser> ()
.Where (x => x.Id >= 5)
.GroupBy (x => new LevelIdAgg () {
LevelId = x.LevelId,
Data = Function.Count ()
})
.ToList ();
// date format
var list = context.Query<TeUser> ()
.GroupBy (x => new RegDateFormatAgg () {
RegDateFormat = x.RegTime.ToString("yyyy-MM-dd"),
Data = Function.Count ()
})
.ToList ();
Join表查詢
- 多表連接配接,支援内連接配接,左連接配接和右連接配接
- 支援查詢結果和聚合資料連接配接在一起
- 連接配接查詢結果指定類或匿名類輸出
- 連接配接查詢結果直接插入資料表
// inner join
var join = context.Query<TeUser> ()
.Join<TeUserExtend>((x,y) => x.Id == y.Id);
// aggregate data join entity table
var join = context.Query<TeMainTable>()
.GroupBy(x => new {
MId = x.MId,
Count = Function.Count(),
})
.Join<TeSubTable>((x, y) => x.MId == y.Id);
執行SQL
- 直接使用SQL和存儲過程
- 支援對象參數
- 查詢結果指定類或匿名類輸出
- 存儲過程支援使用輸出參數
// basic parameter
var sql = "update Te_User set [email protected] where [email protected]";
var ps = new DataParameter[2];
ps[0] = new DataParameter("P1", 5);
ps[1] = new DataParameter("P2", "abc");
var executor = context.CreateSqlStringExecutor(sql, ps);
var ret = executor.ExecuteNonQuery();
// object parameter
var sql = "update Te_User set NickName={nickname} where Id={id}";
var executor = context.CreateSqlStringExecutor(sql, new { nickname = "abc", id = 5 });
var ret = executor.ExecuteNonQuery();
單元測試
該項目使用xUnit進行單元測試,測試代碼位址:https://github.com/aquilahkj/Light.Data2/tree/master/test
每個資料庫有超過300組測試,包含1,000個案例,涵蓋了大部分代碼。
性能測試
目前隻在同一台計算機上使用EF Core,為Linux做Docker Sql Server 2017做簡單的CURD性能測試代碼位址https://github.com/aquilahkj/OrmTest
1000次CUD和單個資料查詢
共有5輪,每輪1000次CUD和1000次資料查詢
EF測試結果
Light.Data測試結果
從比較來看,查詢性能幾乎相同,插入性能Light.Data略勝一籌,批量更新也略勝一籌。
本文僅作簡要介紹,您可以參考文檔和測試用例以了解具體的使用方法。
原文位址:https://www.codeproject.com/Articles/4649209/A-open-source-ORM-framework-Light-Data