ZetCode

C# SqlKata

上次修改时间:2023 年 7 月 13 日

在本文中,我们将展示如何使用 SqlKata 库在 C# 中进行数据库编程。 SqlKata 使用 SqlBuilder 模式来定义查询。

SqlKata 是一个用于 C# 的流畅 SQL 查询构建器。 它允许我们使用方法链轻松创建 SQL 语句。

$ dotnet add project SqlKata
$ dotnet add project SqlKata.Execution

我们添加 SqlKata 包。

$ dotnet add project Npgsql

我们添加 PostgreSQL 数据库的驱动程序。

cars_postgre.sql
CREATE TABLE cars(id serial PRIMARY KEY, name VARCHAR(255), price INT);
INSERT INTO cars(name, price) VALUES('Audi', 52642);
INSERT INTO cars(name, price) VALUES('Mercedes', 57127);
INSERT INTO cars(name, price) VALUES('Skoda', 9000);
INSERT INTO cars(name, price) VALUES('Volvo', 29000);
INSERT INTO cars(name, price) VALUES('Bentley', 350000);
INSERT INTO cars(name, price) VALUES('Citroen', 21000);
INSERT INTO cars(name, price) VALUES('Hummer', 41400);
INSERT INTO cars(name, price) VALUES('Volkswagen', 21600);

在示例中,我们使用此表。

SqlKata 查询单行

在第一个示例中,我们查询单行。

Program.cs
using Npgsql;
using SqlKata.Compilers;
using SqlKata.Execution;

string cs = @"User ID=postgres;Password=passwd;Host=localhost;Database=testdb";

using var con = new NpgsqlConnection(cs);
con.Open();

var compiler = new PostgresCompiler();
var db = new QueryFactory(con, compiler);

var car = db.Query("cars").Where("id", 1).First();

Console.WriteLine(car);
Console.WriteLine($"{car.id} {car.name} {car.price}");

我们选择 Id 等于 1 的行。

string cs = @"User ID=postgres;Password=passwd;Host=localhost;Database=testdb";

using var con = new NpgsqlConnection(cs);
con.Open();

首先,我们定义连接字符串并打开数据库连接。

var compiler = new PostgresCompiler();
var db = new QueryFactory(con, compiler);

我们为我们的数据库选择编译器并定义一个 QueryFactoryQueryFactory 是用于构建 SQL 查询的对象。

var car = db.Query("cars").Where("id", 1).First();

通过链接三个方法调用来构建查询:Query,它选择表名;Where,它定义 WHERE SQL 子句;以及 First,它从结果中返回第一行。

$ dotnet run 
{DapperRow, id = '1', name = 'Audi', price = '52642'}
1 Audi 52642

SqlKata 获取所有行

在下一个示例中,我们获取所有行。

Program.cs
using Npgsql;
using SqlKata.Compilers;
using SqlKata.Execution;

string cs = @"User ID=postgres;Password=passwd;Host=localhost;Database=testdb";

using var con = new NpgsqlConnection(cs);
con.Open();

var compiler = new PostgresCompiler();
var db = new QueryFactory(con, compiler);

var cars = db.Query("cars").OrderByDesc("name").Get();
foreach (var car in cars)
{
    Console.WriteLine($"{car.id} {car.name} {car.price}");
}

该程序从表中获取所有行,并按名称降序排列输出。

var cars = db.Query("cars").OrderByDesc("name").Get();

我们通过链接 QueryOrderByDescGet 调用来获得结果。

$ dotnet run 
4 Volvo 29000
8 Volkswagen 21600
3 Skoda 9000
2 Mercedes 57127
7 Hummer 41400
6 Citroen 21000
5 Bentley 350000
1 Audi 52642

SqlKata 插入行

在下一个示例中,我们将新行插入到表中。

Program.cs
using Npgsql;
using SqlKata.Compilers;
using SqlKata.Execution;

string cs = @"User ID=postgres;Password=passwd;Host=localhost;Database=testdb";

using var con = new NpgsqlConnection(cs);
con.Open();

var compiler = new PostgresCompiler();
var db = new QueryFactory(con, compiler);

int n = db.Query("cars").Insert(new
{
    name = "Toyota",
    price = 27890
});

if (n == 1)
{
    Console.WriteLine("New row inserted");
}

Insert 方法用于生成 INSERT SQL 语句。

SqlKata 删除行

在下一个示例中,我们从表中删除一行。

Program.cs
using Npgsql;
using SqlKata.Compilers;
using SqlKata.Execution;

string cs = @"User ID=postgres;Password=passwd;Host=localhost;Database=testdb";

using var con = new NpgsqlConnection(cs);
con.Open();

var compiler = new PostgresCompiler();
var db = new QueryFactory(con, compiler);

int id = 9;
int n = db.Query("cars").Where("id", id).Delete();

if (n == 1)
{
    Console.WriteLine("row succesfully deleted");
}

该程序删除 id 等于 9 的行。

int n = db.Query("cars").Where("id", id).Delete();

要创建语句,我们使用了 QueryWhereDelete 方法调用。

SQL Server 示例

我们使用了 PostgreSQL 数据库。 下一个示例展示了如何为 SQL Server 创建一个简单的示例。

$ dotnet add package SqlKata
$ dotnet add package SqlKata.Execution
$ dotnet add package System.Data.SqlClient

我们将这三个包添加到我们的项目中。

cars_sqlserver.sql
DROP TABLE IF EXISTS cars;
CREATE TABLE cars(id INT PRIMARY KEY IDENTITY(1, 1), name VARCHAR(255), price INT);

INSERT INTO cars(name, price) VALUES('Audi',52642);
INSERT INTO cars(name, price) VALUES('Mercedes',57127);
INSERT INTO cars(name, price) VALUES('Skoda',9000);
INSERT INTO cars(name, price) VALUES('Volvo',29000);
INSERT INTO cars(name, price) VALUES('Bentley',350000);
INSERT INTO cars(name, price) VALUES('Citroen',21000);
INSERT INTO cars(name, price) VALUES('Hummer',41400);
INSERT INTO cars(name, price) VALUES('Volkswagen',21600);

我们有 SQL Server 的 SQL。

Program.cs
using System.Data.SqlClient;
using SqlKata.Compilers;
using SqlKata.Execution;

string cs = @"Server=localhost\SQLEXPRESS;Database=testdb;Trusted_Connection=True;";

using var con = new SqlConnection(cs);
con.Open();

var compiler = new SqlServerCompiler();
var db = new QueryFactory(con, compiler);

var cars = db.Query("cars").Get<Car>();

foreach (var car in cars)
{
    Console.WriteLine(car);
}

class Car
{
    public int Id { get; init; }
    public string Name { get; init; }
    public int Price { get; init; }
    
    public Car(int Id, string Name, int Price)
    {
        this.Id = Id;
        this.Name = Name;
        this.Price = Price;
    }

    public override string ToString()
    {
        return $"[{this.Id} {this.Name} {this.Price}]";
    }
}

在此示例中,我们获取 SQL Server 数据库表中所有的行。

using System.Data.SqlClient;

该命名空间已构建到 .NET Core 中。

using var con = new SqlConnection(cs);

我们使用 SqlConnection

var compiler = new SqlServerCompiler();

我们使用 SqlServerCompiler

来源

Sqlkata 文档

在本文中,我们展示了如何使用 SqlKata 在 C# 中进行数据库编程。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程