Лучшие способы объединения данных из двух источников с использованием Linq - PullRequest
2 голосов
/ 06 марта 2011

У меня есть некоторый код на C # / Linq, используемый для объединения данных из файла Excel в базу данных, что требует большей производительности.

Есть
1. Список, прочитанный из файла Excel: List<Score> newScoreList
2. Таблица БД с именем Scores, первичные ключи peopleId и testDate

Мне нужно объединить данные из списка в таблицу, и, если есть какие-либо повторяющиеся данные, обновить их.

Мое текущее решение:

1) Найдите повторяющиеся данные с помощью этого выражения LINQ:

var dupliData =  
    from newScore in newScoreList  
    from oldScore in db.Scores  
    where newScore.peopleId == oldScore.peopleId && newScore.testDate == oldScore.testDate  
    select oldScore;  

2) Удалить дубликаты данных.

db.Scores.DeleteAllOnSubmit(dupliData); 

3) Вставьте новые данные из списка.

db.Scores.InsertAllOnSubmit(newScoreList);

Кто-нибудь может дать мне лучшее решение?

Ответы [ 2 ]

1 голос
/ 06 марта 2011

Я вообще ненавижу хранимые процедуры, но это probably идеальный случай для их использования. Мой TSQL ржавый, но это должно дать представление.

CREATE PROCEDURE dbo.InsertOrUpdateScore
(
    @id as Int,
    @date as DateTime,
    @result as varchar(20)
)
AS

if not exists(SELECT id FROM Scores WHERE id = @id AND date = @date)
begin
   INSERT INTO Scores (id, date, result) values (@id, @date, @result)
end
else
begin
   UPDATE Scores
   SET result = @result
   WHERE id = @id AND date = @date
end
GO 

Теперь в браузере сервера LINQ выберите сущность Score и измените ее поведение INSERT и UPDATE, чтобы использовать только что созданную вами хранимую процедуру. Убедитесь, что пользователь, обращающийся к базе данных, имеет разрешение EXECUTE на SPROC.

Это должно работать немного быстрее, чем ваша версия. Вы торгуете предложением IN для N SELECT по индексу, который может быть быстрее. Однако результирующий набор предложения IN не передается обратно клиенту по сети, что может сэкономить немало времени.

Опишите точно, сколько времени занимает ваш метод, прежде чем реализовывать это, так что вы можете оценить, действительно ли это быстрее.

Я не уверен, что это единственный способ создать Score в вашем приложении, но вы можете рассмотреть случай, когда вы ВСТАВЛЯЕТЕ запись, у которой еще нет идентификатора. Вам нужно изменить SPROC так, чтобы он разрешал @id как null, и соответственно обрабатывал INSERT.

Тогда это должно просто быть:

db.Scores.InsertAllOnSubmit(newScoreList);
0 голосов
/ 06 марта 2011

Если вы используете SQL 2008, вы можете использовать команду Merge http://www.builderau.com.au/program/sqlserver/soa/Using-SQL-Server-2008-s-MERGE-statement/0,339028455,339283059,00.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...