我们在 ASP.net MVC 5 应用程序中使用 Dapper.net 作为数据层。
一项操作需要使用 MERGE 命令(如果 TitleID 存在,则更新记录,如果不存在,则插入) - 如下所示:
MERGE BookInventory bi
USING BookOrder bo
ON bi.TitleID = bo.TitleID
WHEN MATCHED THEN
UPDATE
SET bi.Quantity = bi.Quantity + bo.Quantity
WHEN NOT MATCHED BY TARGET THEN
INSERT (TitleID, Title, Quantity)
VALUES (bo.TitleID, bo.Title,bo.Quantity);
Run Code Online (Sandbox Code Playgroud)
可以使用 Dapper 将值映射到此 MERGE 语句上吗?
我在这方面找不到任何内容,目前还不清楚将 MERGE 与 Dapper.net 一起使用的最佳方法是什么?
小智 7
刚刚发现你可以像我在 .NET Fiddle 代码中所做的那样:https : //dotnetfiddle.net/e2G3Ho
粘贴下面的代码
// @nuget: Dapper -Version 1.60.6
using Dapper;
using System;
using System.Data.SqlClient;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public class OrderDetail
{
public int OrderDetailID { get; set; }
public int OrderID { get; set; }
public int ProductID { get; set; }
public int Quantity { get; set; }
}
public static void Main()
{
string sql = "SELECT * FROM OrderDetails";
string sql2 = @"MERGE INTO OrderDetails AS TARGET
USING (
VALUES
(@OrderDetailID, @OrderID, @ProductID, @Quantity)
) AS SOURCE (OrderDetailID, OrderID, ProductID, Quantity)
ON SOURCE.OrderDetailID = TARGET.OrderDetailID
WHEN MATCHED THEN
UPDATE SET Quantity = 666
WHEN NOT MATCHED THEN
INSERT (OrderID, ProductID, Quantity)
VALUES (SOURCE.OrderID, SOURCE.ProductID, SOURCE.Quantity);
";
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
List<OrderDetail> details = new List<OrderDetail> {
{new OrderDetail() {OrderDetailID = 1, OrderID = 1024, ProductID = 42, Quantity = 1000} },
{new OrderDetail() {OrderDetailID = 9999, OrderID = 10268, ProductID = 42, Quantity = 1000} }
};
connection.Execute(sql2, details);
var orderDetails = connection.Query<OrderDetail>(sql).ToList();
FiddleHelper.WriteTable(orderDetails);
}
}
}
Run Code Online (Sandbox Code Playgroud)
未经测试,但这应该可以解决问题:
const string sql = @"
merge into SomeTable as Target
using (select @myId AS id) as Source
on (Target.id = Source.id)
when matched then
update set Target.SomeColumn = @myValue
when not matched by Target then
insert (SomeColumn) values (@myValue)";
conn.Execute(sql, new { myId = 999, myValue = 123 })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6523 次 |
| 最近记录: |