Przyspieszenie wkładek LINQ

Mam plik CSV i muszę go wstawić do bazy danych SQL Server. Czy istnieje sposób na przyspieszenie wstawiania LINQ?

Stworzyłem prostą metodę Repozytorium, aby zapisać rekord:

    public void SaveOffer(Offer offer)
    {
        Offer dbOffer = this.db.Offers.SingleOrDefault (
             o => o.offer_id == offer.offer_id);

        // add new offer
        if (dbOffer == null)
        {
            this.db.Offers.InsertOnSubmit(offer);
        }
        //update existing offer
        else
        {
            dbOffer = offer;
        }

        this.db.SubmitChanges();
    }

Ale dzięki tej metodzie program jest znacznie wolniejszy niż wstawianie danych za pomocą wstawek SQL ADO.net (nowe SqlConnection, nowe SqlCommand dla select if istnieje, nowe SqlCommand dla aktualizacji / insert).

W wierszach 100k csv trwa około godziny lub około 1 minuty na sposób ADO.net. Dla wierszy csv 2M zajęło ADO.net około 20 minut. LINQ dodał około 30k tych 2M wierszy w 25 minut. Moja baza danych ma 3 tabele, połączone w dbml, ale pozostałe dwie tabele są puste. Testy zostały wykonane przy wszystkich stołach pustych.

P.S. Próbowałem użyć SqlBulkCopy, ale muszę zrobić kilka transformacji w ofercie przed wstawieniem go do db i myślę, że pokonuje cel SqlBulkCopy.

Aktualizacje / Edycje: Po 18 godzinach wersja LINQ dodała tylko ~ 200K wierszy.

Przetestowałem import tylko za pomocą wkładek LINQ, a także jest bardzo powolny w porównaniu z ADO.net. Nie widziałem dużej różnicy między wstawkami / submitchanges i select / updates / insertts / submitchanges.

Nadal muszę spróbować wsadowego zatwierdzania, ręcznie łącząc się z db i skompilowanymi zapytaniami.

questionAnswers(11)

yourAnswerToTheQuestion