SqlKata

2022-10-06 06:00:23

SqlKata查詢生成器是一個用C# 編寫的功能強大的Sql查詢生成器。它是安全的,與框架無關。靈感來源於可用的頂級查詢生成器,如Laravel Query Builder和 Knex

SqlKata有一個富有表現力的API。它遵循一個乾淨的命名約定,這與SQL語法非常相似。

通過在受支援的資料庫引擎上提供一個抽象級別,允許您使用相同的統一API處理多個資料庫,並且可搭配 dapper 使用,可以有效替代資料庫的儲存過程。

SqlKata支援複雜的查詢,例如巢狀條件、從子查詢中選擇、過濾子查詢、條件語句等。目前它有built-in編譯器,用於SqlServer、MySql、PostgreSql、Oracle 和Firebird等。

擴充套件專案https://github.com/fairking/FluentSqlKata 可以輕鬆地與EntityFramework Core 6 一起使用,而無需進行大量程式碼更改.

完整的檔案在https://sqlkata.com上檢視。

安裝

使用dotnet cli

$ dotnet add package SqlKata

使用Nuget包管理器

PM> Install-Package SqlKata

Quick Examples

Setup Connection
var connection = new SqlConnection("...");
var compiler = new SqlCompiler();

var db = new QueryFactory(connection, compiler)
檢索所有記錄
var books = db.Query("Books").Get();
僅檢索已出版的圖書
var books = db.Query("Books").WhereTrue("IsPublished").Get();
取回一本書
var introToSql = db.Query("Books").Where("Id", 145).Where("Lang", "en").First();
檢索最近的書籍:最近10本
var recent = db.Query("Books").OrderByDesc("PublishedAt").Limit(10).Get();
包括作者資訊
var books = db.Query("Books")
    .Include(db.Query("Authors")) // Assumes that the Books table have a `AuthorId` column
    .Get();

這將包括每個「書」上的「作者」屬性

[{
    "Id": 1,
    "PublishedAt": "2019-01-01",
    "AuthorId": 2
    "Author": { // <-- included property
        "Id": 2,
        "...": ""
    }
}]
加入作者表
var books = db.Query("Books")
    .Join("Authors", "Authors.Id", "Books.AuthorId")
    .Select("Books.*", "Authors.Name as AuthorName")
    .Get();

foreach(var book in books)
{
    Console.WriteLine($"{book.Title}: {book.AuthorName}");
}
條件查詢
var isFriday = DateTime.Today.DayOfWeek == DayOfWeek.Friday;

var books = db.Query("Books")
    .When(isFriday, q => q.WhereIn("Category", new [] {"OpenSource", "MachineLearning"}))
    .Get();

分頁
var page1 = db.Query("Books").Paginate(10);

foreach(var book in page1.List)
{
    Console.WriteLine(book.Name);
}

...

var page2 = page1.Next();
新增
int affected = db.Query("Users").Insert(new {
    Name = "Jane",
    CountryId = 1
});
更新
int affected = db.Query("Users").Where("Id", 1).Update(new {
    Name = "Jane",
    CountryId = 1
});
刪除
int affected = db.Query("Users").Where("Id", 1).Delete();