Entity Framework 扩展:带有更新语句的 BulkMerge

Entity Framework Extensions: BulkMerge with update statement

在使用 Entity Framework 扩展的 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...

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

这是一个使用 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 是将在其上更新数据的 table。因此,您的示例中的 TARGET table。

临时表

StagingTable 是 table 从中获取数据以进行更新的表。因此,您的示例中的 SOURCE table。