0

使用实体框架扩展的 BulkMerge 时,有什么方法可以运行更新语句?例如,如果记录存在,则将数据库中的当前值加上参数列表中的值相加。如果记录不存在,则只需在数据库中插入参数列表的值。

我正在寻找要包含的内容,例如 (x => new Animal {Age = x.Age + parameters.Age});

就 SQL 而言,它会是这样的合并:

WHEN MATCHED THEN 
        UPDATE SET      
        TARGET.ColumNumber = TARGET.ColumNumber + SOURCE.ColumNumber
WHEN NOT MATCHED BY TARGET THEN 
    INSERT...
4

1 回答 1

0

是的,可以添加硬编码公式。

这是使用 PostConfiguration 的示例:https ://dotnetfiddle.net/s8QF4t

context.BulkMerge(list, options => {
    options.PostConfiguration = bulk => {
        bulk.ColumnMappings.Single(x => x.SourceName == "Description").FormulaUpdate = "DestinationTable.Name + ';' + StagingTable.Description";
    };
});

这是一个通过映射所有列的示例:https ://dotnetfiddle.net/enOEQF

context.BulkMerge(list, options => {
    options.ColumnMappings.Add(new Z.BulkOperations.ColumnMapping<Customer>(x => x.CustomerID, true));
    options.ColumnMappings.Add(new Z.BulkOperations.ColumnMapping<Customer>(x => x.Name));

    var columnMapping = new Z.BulkOperations.ColumnMapping<Customer>(x => x.Description);
    columnMapping.FormulaUpdate = "DestinationTable.Name + ';' + StagingTable.Description";
    options.ColumnMappings.Add(columnMapping);
});

这两个示例都连接了 2 个字段,但如您所见,您可以使用任何类型的公式。使用DestinationTableStagingTable别名很重要

目的地表

DestinationTable 是将更新数据的表。所以TARGET你的例子中的表格。

暂存表

StagingTable 是从中获取数据以进行更新的表。所以SOURCE你的例子中的表格。

于 2019-10-18T11:59:37.400 回答