Sql server 将本地实体合并到表中,跳过主键(linq2db)
我想使用linq2db将本地实体列表合并到一个表中(如果它们还不存在的话) 我试着做到以下几点:Sql server 将本地实体合并到表中,跳过主键(linq2db),sql-server,linq2db,Sql Server,Linq2db,我想使用linq2db将本地实体列表合并到一个表中(如果它们还不存在的话) 我试着做到以下几点: var recordsConvertedToOrders = reportRecords.Select(i => { // some predefined conversion var order = mapper.Map<Order>(i); order.Created = DateTime.Now; return order; }); usi
var recordsConvertedToOrders = reportRecords.Select(i =>
{
// some predefined conversion
var order = mapper.Map<Order>(i);
order.Created = DateTime.Now;
return order;
});
using (var db = new DataConnection("StuckOrders"))
{
var count = await db.GetTable<Order>()
.Merge()
.Using(recordsConvertedToOrders)
.On((t, s) => t.OrderlineID == s.OrderlineID)
.InsertWhenNotMatched()
.MergeAsync();
}
这是因为生成了以下SQL
(注意,0
被传递给Id
,然后与INSERT
一起插入到表中。)
这是我的订单
模型,由linq2db生成:
[Table(Schema="dbo", Name="Order")]
public partial class Order
{
[Column(), PrimaryKey, Identity] public long Id { get; set; } // bigint
...
我希望在MERGE
SQL中跳过Id
s,以便将它们生成为正常的增量标识值
我最终指定了手动插入的字段(我不喜欢这样,因为它重复了我们的AutoMapper映射):
使用(var db=newdataconnection(“StuckOrders”))
{
var count=await db.GetTable()
.Merge()
.使用(报告记录)
.On((t,s)=>t.OrderlineID==s.OrderlineID)
.InsertWhenNotMatched(s=>新订单
{
OrderId=s.OrderId,
OrderItemId=s.OrderItemId,
OrderItemCode=s.OrderItemCode,
//OrderCode=s.OrderCode,
ProductionTicketID=s.ProductionTicketID,
OrderDateTime=s.OrderDateTime,
OrderDate=s.OrderDate,
UploadEndDateTime=s.UploadEndDateTime,
OrderlineID=s.OrderlineID.Value,
ProductContentStatusName=s.ProductContentStatusName,
ProductContentStatusDate=s.ProductContentStatusDate,
日期=s.日期,
checknotinfullimentflow=s.check\u notIn\u fullimentflow,
CheckNotInPlantFromOrderDomain=s.check\u notIn\u PlantFromOrderDomain,
CheckNotInFulfillment=s.check\u notinfulfillment,
CheckNotInPlantFromFulfillment=s.check\u notIn\u PlantFromFulfillment,
检查凭证=s.检查凭证,
CheckExternalVendors=s.check\u ExternalVendors,
CheckNotInWaiting=s.check\u notinwaiting,
CheckDescription=s.CheckDescription,
ProductContentID=s.ProductContentID,
EditorName=s.EditorName,
Created=DateTime。现在,
})
.MergeAsync();
}
如何使第一个代码段按预期工作?也发布为
-- StuckOrders SqlServer.2012 (asynchronously)
SET IDENTITY_INSERT [dbo].[Order] ON
MERGE INTO [dbo].[Order] [Target]
USING
(
VALUES
(0,9369660,13869511,N'BP1328147327',NULL,NULL,NULL,'2017-11-08T23:08:54','2017-11-08','2017-11-08T23:08:00',18302384,N'LinkedProductToProductContent',NULL,'2017-11-16T09:24:14.300',0,0,0,0,0,0,0,N'3. orderitem (FFApi) not in FulfilmentOrderlines',15829191,N'Windows Editor',0,NULL,NULL,'2017-11-16T13:28:10.866',NULL),
(0,9308332,13792138,N'NO1320410131',NULL,NULL,NULL,'2017-11-04T22:58:49','2017-11-04','2017-11-04T22:57:00',18193864,N'FailedFinalizerJob',NULL,'2017-11-16T09:24:14.300',0,0,0,0,0,0,0,N'1. orderitem not in fulfilmentflow',15745587,N'Prints Editor',0,NULL,NULL,'2017-11-16T13:28:10.896',NULL)
) [Source] ([c0], [c1], [c2], [c3], [c4], [c5], [c6], [c7], [c8], [c9], [c10], [c11], [c12], [c13], [c14], [c15], [c16], [c17], [c18], [c19], [c20], [c21], [c22], [c23], [c24], [c25], [c26], [c27], [c28])
ON ([Target].[OrderlineID] = [Source].[c10])
WHEN NOT MATCHED THEN
INSERT
(
[Id],
[OrderId],
[OrderItemId],
[OrderItemCode],
[OrderCode],
[CopyItemCode],
[ProductionTicketID],
[OrderDateTime],
[OrderDate],
[UploadEndDateTime],
[OrderlineID],
[ProductContentStatusName],
[ProductContentStatusDate],
[Date],
[check_notIn_FulfillmentFlow],
[check_notIn_PlantFromOrderDomain],
[check_notIn_Fulfillment],
[check_notIn_PlantFromFulfillment],
[check_Vouchers],
[check_ExternalVendors],
[check_notIn_Waiting],
[CheckDescription],
[ProductContentID],
[EditorName],
[Resolved],
[FixOrdersJira],
[RootCauseJira],
[Created],
[Updated]
)
VALUES
(
[Source].[c0],
[Source].[c1],
[Source].[c2],
[Source].[c3],
[Source].[c4],
[Source].[c5],
[Source].[c6],
[Source].[c7],
[Source].[c8],
[Source].[c9],
[Source].[c10],
[Source].[c11],
[Source].[c12],
[Source].[c13],
[Source].[c14],
[Source].[c15],
[Source].[c16],
[Source].[c17],
[Source].[c18],
[Source].[c19],
[Source].[c20],
[Source].[c21],
[Source].[c22],
[Source].[c23],
[Source].[c24],
[Source].[c25],
[Source].[c26],
[Source].[c27],
[Source].[c28]
)
;
SET IDENTITY_INSERT [dbo].[Order] OFF
[Table(Schema="dbo", Name="Order")]
public partial class Order
{
[Column(), PrimaryKey, Identity] public long Id { get; set; } // bigint
...
using (var db = new DataConnection("StuckOrders"))
{
var count = await db.GetTable<Order>()
.Merge()
.Using(reportRecords)
.On((t, s) => t.OrderlineID == s.OrderLineId)
.InsertWhenNotMatched(s => new Order
{
OrderId = s.OrderId,
OrderItemId = s.OrderItemId,
OrderItemCode = s.OrderItemCode,
//OrderCode = s.OrderCode,
ProductionTicketID = s.ProductionTicketId,
OrderDateTime = s.OrderDateTime,
OrderDate = s.OrderDate,
UploadEndDateTime = s.UploadEndDateTime,
OrderlineID = s.OrderLineId.Value,
ProductContentStatusName = s.ProductContentStatusName,
ProductContentStatusDate = s.ProductContentStatusDate,
Date = s.Date,
CheckNotInFulfillmentFlow = s.check_notIn_FulfillmentFlow,
CheckNotInPlantFromOrderDomain = s.check_notIn_PlantFromOrderDomain,
CheckNotInFulfillment = s.check_notIn_Fulfillment,
CheckNotInPlantFromFulfillment = s.check_notIn_PlantFromFulfillment,
CheckVouchers = s.check_Vouchers,
CheckExternalVendors = s.check_ExternalVendors,
CheckNotInWaiting = s.check_notIn_Waiting,
CheckDescription = s.CheckDescription,
ProductContentID = s.ProductContentID,
EditorName = s.EditorName,
Created = DateTime.Now,
})
.MergeAsync();
}