【发布时间】:2011-04-04 01:32:26
【问题描述】:
是否存在处理批量插入(通过 LINQ)但丢弃可能已经在表中的记录的“最佳实践”方式?或者我将不得不对导入表进行批量插入然后删除重复项,或者一次插入一条记录?
2010 年 8 月 26 日 - 编辑 #1:
我现在正在研究 Intersect 和 except 方法。我正在从不同的来源收集数据,转换成一个列表,想要与目标数据库“比较”,然后只插入新记录。
List<DTO.GatherACH> allACHes = new List<DTO.GatherACH>();
State.IState myState = null;
State.Factory factory = State.Factory.Instance;
foreach (DTO.Rule rule in Helpers.Config.Rules)
{
myState = factory.CreateState(rule.StateName);
List<DTO.GatherACH> stateACHes = myState.GatherACH();
allACHes.AddRange(stateACHes);
}
List<Model.ACH> newRecords = new List<Model.ACH>(); // Create a disconnected "record set"...
foreach (DTO.GatherACH record in allACHes)
{
var storeInfo = dbZach.StoreInfoes.Where(a => a.StoreCode == record.StoreCode && (a.TypeID == 2 || a.TypeID == 4)).FirstOrDefault();
Model.ACH insertACH = new Model.ACH
{
StoreInfoID = storeInfo.ID,
SourceDatabaseID = (byte)sourceDB.ID,
LoanID = (long)record.LoanID,
PaymentID = (long)record.PaymentID,
LastName = record.LastName,
FirstName = record.FirstName,
MICR = record.MICR,
Amount = (decimal)record.Amount,
CheckDate = record.CheckDate
};
newRecords.Add(insertACH);
}
上面的代码构建了 newRecords 列表。现在,我试图通过比较 3 字段唯一索引来从此列表中获取不在数据库中的记录:
AchExceptComparer myComparer = new AchExceptComparer();
var validRecords = dbZach.ACHes.Intersect(newRecords, myComparer).ToList();
比较器看起来像:
class AchExceptComparer : IEqualityComparer<Model.ACH>
{
public bool Equals(Model.ACH x, Model.ACH y)
{
return (x.LoanID == y.LoanID && x.PaymentID == y.PaymentID && x.SourceDatabaseID == y.SourceDatabaseID);
}
public int GetHashCode(Model.ACH obj)
{
return base.GetHashCode();
}
}
但是,我收到此错误:
LINQ to Entities 无法识别方法 'System.Linq.IQueryable
1[MisterMoney.LARS.ZACH.Model.ACH] Intersect[ACH](System.Linq.IQueryable1[MisterMoney.LARS.ZACH.Model.ACH]、System.Collections.Generic.IEnumerable1[MisterMoney.LARS.ZACH.Model.ACH], System.Collections.Generic.IEqualityComparer1[MisterMoney.LARS.ZACH] .Model.ACH])' 方法,并且该方法不能翻译成商店表达式。
有什么想法吗?是的,这完全符合原始问题。 :)
【问题讨论】:
-
是的 - 你是对的。我用 C# 而不是 VB 编写,并且通常有我的问题的代码示例。对不起。
标签: c# linq-to-sql bulkinsert