【发布时间】:2021-09-24 12:30:24
【问题描述】:
我正在开发 Entity Framework Core 的扩展以进行批量操作。我创建了一个运行良好的 BulkInsert 方法:
public static void BulkInsert<T>(this DbContext ctx, List<T> list, bool identityInsert = false, int batchSize=1000)
现在,我正在研究 BulkInsertOrUpdate 的方法。我希望方法签名看起来像这样:
public static void BulkInsertOrUpdate<T>(this DbContext ctx, List<T> list, List<TProperty> columnsToMatch, List<TProperty> columnsToUpdate, bool identityInsert = false, int batchSize=1000)
我编造了“TProperty”——甚至不确定它是否存在。我做了一些研究,发现了许多使用 lamda 表达式传递属性的解决方案——通常在某些用途中,例如指定一个“排序依据”列来对泛型类型对象列表进行排序。也许我没有足够的创造力,但我还没有想出一个可以让我在这里应用这种方法的解决方案。我可以只传递字符串列表,然后在运行时根据泛型类的属性检查列表,但这对开发人员不太友好。有什么想法吗?
示例用法:假设我有一个名为 FooDB 的数据库。在 FooDB 内部,我有一个名为 Person 的表。我正在合并来自某个来源的人员记录列表。一些记录可能是新的,另一些可能是需要更新的现有记录。在这种情况下,我想通过 FirstName、LastName、DateOfBirth 的组合来查找记录。如果存在具有相同 FirstName、LastName、DateOfBirth 组合的记录,我将更新现有记录上的 Address、City、State、Zip。否则,我将插入一条新记录。我想这样称呼我的函数...
fooDbContext.BulkInsertOrUpdate(listOfPersonRecords, new List<IProperty>(){Person.FirstName, Person.LastName, Person.DateOfBirth}, new List<IProperty>(){Person.Address, Person.City, Person.State, Person.Zip});
注意:在创建此示例时,我意识到我可能不是在寻找 TProperty,而是在寻找 IProperty...但是,我如何指定 IProperty 值需要是类 T 的属性?
【问题讨论】:
-
强烈推荐使用第三方工具,如entityframework核心扩展。
-
我假设您希望每列具有不同的类型,但是在 c# 中无法表示可变数量的泛型类型参数。所以你需要一些其他的解决方法。
-
也许我的问题不够清楚。我将添加一个示例用法......另外,我目前正在使用 nuget 上当前可用的 efcore.bulkextensions 扩展,但它有一些我正在尝试解决的限制。