我們都知道Dapper是一個非常好用的ORM框架,它對 ADO.NET的簡單封裝,使得開發者可以更加高效、快速地與資料庫進行互動。
今天推薦一個 Dapper的擴充套件庫,讓你 Dapper使用更加簡單、方便。
01
計畫簡介
DapperQueryBuilder是擴充套件庫,它增強了Dapper的功能,特別是關於動態SQL查詢和命令的構建。它提供了字串插值和Fluent API的操作方式,讓我們構建復雜的動態查詢變得更加直觀和簡單,並且沒有SQL註入的風險。
02
使用方法與範例
1、 字串插值
//Dapper寫法
string productName = "%Computer%";
int subCategoryId = 10;
//Dapper寫法:傳入參數值
var products = cn
.Query<Product>($@"
SELECT * FROM Product
WHERE
Name LIKE @productName
AND ProductSubcategoryID = @subCategoryId
ORDER BY ProductId",
new { productName, subCategoryId });
//DapperQueryBuilder:直接在查詢語句插入值
var products = cn
.QueryBuilder($@"
SELECT * FROM Product
WHERE
Name LIKE {productName}
AND ProductSubcategoryID = {subCategoryId}
ORDER BY ProductId"
).Query<Product>();
2、簡化程式碼量,以下是2者的對比
//Dapper程式碼量:需要定義SQL語句、參數列物件
var dynamicParams = new DynamicParameters();
string sql = "SELECT * FROM Product WHERE 1=1";
sql += " AND Name LIKE @productName";
dynamicParams.Add("productName", productName);
sql += " AND ProductSubcategoryID = @subCategoryId";
dynamicParams.Add("subCategoryId", subCategoryId);
var products = cn.Query<Product>(sql, dynamicParams);
//DapperQueryBuilder:字串插值的方式,更加直觀而且程式碼量更少
var query = cn.QueryBuilder($"SELECT * FROM Product WHERE 1=1");
query += $"AND Name LIKE {productName}";
query += $"AND ProductSubcategoryID = {subCategoryId}";
var products = query.Query<Product>();
3、動態查詢
查詢條件
//其中 /**where**/ 為查詢條件
var q = cn.QueryBuilder($@"
SELECT ProductId, Name, ListPrice, Weight
FROM Product
/**where**/
ORDER BY ProductId
");
//自動添加查詢條件至查詢
q.Where($"ListPrice <= {maxPrice}");
q.Where($"Weight <= {maxWeight}");
q.Where($"Name LIKE {search}");
//執行
var products = q.Query<Product>();
or 和 and查詢條件
var q = cn.QueryBuilder($@"
SELECT ProductId, Name, ListPrice, Weight
FROM Product
/**where**/
ORDER BY ProductId
");
//Filters.FiltersType可以指定OR、And等方式
var priceFilters = new Filters(Filters.FiltersType.OR)
{
new Filter($"ListPrice >= {minPrice}"),
new Filter($"ListPrice <= {maxPrice}")
};
//為And查詢條件
q.Where("Status={status}");
//為And查詢條件
q.Where(priceFilters);
//執行
var products = q.Query<Product>();
in查詢條件
var q = cn.QueryBuilder($@"
SELECT c.Name asCategory, sc.Name as Subcategory, p.Name, p.ProductNumber
FROM Product p
INNERJOIN ProductSubcategory sc ON p.ProductSubcategoryID=sc.ProductSubcategoryID
INNERJOIN ProductCategory c ON sc.ProductCategoryID=c.ProductCategoryID");
var categories = new string[] { "Components", "Clothing", "Acessories" };
q += $"WHERE c.Name IN {categories}";
4、鏈式的
var q = cn.FluentQueryBuilder()
.Select($"ProductId")
.Select($"Name")
.Select($"ListPrice")
.Select($"Weight")
.From($"Product")
.Where($"ListPrice <= {maxPrice}")
.Where($"Weight <= {maxWeight}")
.Where($"Name LIKE {search}")
.OrderBy($"ProductId");
var products = q.Query<Product>();
以上是部份範例,此擴充套件庫,還有其他非常多的功能,大家感興趣的可以查閱計畫文件。
03
計畫地址
https://github.com/Drizin/DapperQueryBuilder
覺得好看 點個在看👇