Используйте метод расширения Distinct
Линка, чтобы позволить циклу foreach перечислять различные значения в вашей коллекции errorCodes / массиве:
using System.Linq;
...
foreach (var ec in errorCodes.Distinct())
{
...
}
(Не забудьте импортировать System.Linq
Пространство имен.)
Вот способ поверхностного клонирования объектов LINQ (без первичного ключа): Копирование объектов Linq .
Его можно настроить для использования метамодели, если вы не используют атрибуты. Тогда все, что вам нужно, это 2 контекста данных (один источник, один пункт назначения).
В качестве альтернативы вы можете посмотреть SqlBulkCopy
- см. Копирование из одной таблицы базы данных в другую C #
Это чисто академическое упражнение?
В противном случае я бы серьезно подумал об использовании SSIS: http://msdn.microsoft.com/en-us/library/ms141026.aspx вместо этого, или об отказе этого Rhino ETL: http : //ayende.com/Blog/archive/2008/01/16/Rhino-ETL-2.0.aspx для передачи данных между базами данных. [текст ссылки] [1]
Зачем для этого использовать LINQ? Для фреймворка, когда вы можете использовать DTS SQL Server, кажется немного лишним.
Я использую DataContractCloner для отсоединения сущностей LINQ-to-SQL:
/// <summary>
/// Serializes the entity to XML.
/// </summary>
/// <returns>String containing serialized entity.</returns>
public string Serialize()
{
return DataContractCloner.Serialize<Organization>(this);
}
/// <summary>
/// Deserializes the entity from XML.
/// </summary>
/// <param name="xml">Serialized entity.</param>
/// <returns>Deserialized entity.</returns>
public static Organization Deserialize(string xml)
{
return DataContractCloner.Deserialize<Organization>(xml);
}
Все сущности LINQ-to-SQL уже аннотированы, поэтому создается присоединяемый клон, который позже можно повторно присоединить с некоторыми оговорками. Сначала будут разрешены отношения внешнего ключа, поэтому вы должны вставить в порядке зависимости, и если у вас есть циклические отношения, вам придется удалить внешние ключи из вашей схемы и повторно применить после передачи. Во-вторых, LINQ-to-SQL не выполняет вставку идентификатора, поэтому, если вы используете столбцы идентификатора с автоинкрементом, у вас могут возникнуть проблемы с отправкой. У меня не получилось заставить DataContext включить идентификацию вставки, но YMMV.
Вместо этого вы можете рассмотреть возможность использования класса SQLBulkCopy. Вы можете найти статью о проекте кода здесь: http://www.codeproject.com/KB/database/SqlBulkCopy.aspx . Это был бы более быстрый способ сделать это, но я предполагаю, что для этого потребуется, чтобы вы сами создавали запросы, вместо того, чтобы позволять LINQ-to-SQL делать это.