Есть ли лучший метод обработки массовых вставок (через LINQ), но отбрасывать записи, которые уже могут быть в таблице?Или мне придется либо выполнить массовую вставку в таблицу импорта, затем удалить дубликаты, либо вставить одну запись за раз?
08/26/2010 - EDIT # 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.IQueryable
1 [MisterMoney.LARS.ZACH.Model.ACH],System.Collections.Generic.IEnumerable 1[MisterMoney.LARS.ZACH.Model.ACH], System.Collections.Generic.IEqualityComparer
1 [MisterMoney.LARS.ZACH.Model.ACH]) ', и этот метод нельзя преобразовать в выражение хранилища.
Есть идеи?И да, это полностью соответствует первоначальному вопросу.:)