2010-06-02 13 views
5

Potrzebuję pomocy w re-factoring tego starszego kodu LINQ-SQL, który generuje około 100 instrukcji aktualizacji.LINQ-SQL Aktualizowanie wielu wierszy w pojedynczej transakcji

Będę grał dalej z najlepszym rozwiązaniem, ale doceniłbym pewne pomysły/wcześniejsze doświadczenia z tym problemem.

Oto mój kod:

List<Foo> foos; 
int userId = 123; 

using (DataClassesDataContext db = new FooDatabase()) 
{ 
    foos = (from f in db.FooBars 
      where f.UserId = userId 
      select f).ToList(); 

    foreach (FooBar fooBar in foos) 
    { 
     fooBar.IsFoo = false; 
    } 

    db.SubmitChanges() 
} 

Zasadniczo chcę zaktualizować pole false IsFoo dla wszystkich rekordów, które mają szczególną wartość UserId.

Co się dzieje jest .ToList() jest wystrzelenie kwerendy, aby uzyskać wszystkie FooBars dla konkretnego użytkownika, a następnie dla każdego obiektu Foo, jego wykonanie jest UPDATE komunikatu aktualizującego właściwość IsFoo.

Czy powyższy kod można ponownie uwzględnić w jednym pojedynczym oświadczeniu UPDATE?

Idealnie, tylko SQL chcę zwolniony jest poniżej:

UPDATE FooBars 
SET IsFoo = FALSE 
WHERE UserId = 123 

EDIT

Ok, więc wygląda na to mogę to zrobić bez użycia db.ExecuteCommand.

Grr ...!

Prawdopodobnie powstanie nowa metoda rozszerzenia dla przestrzeni nazw DLINQ. Nadal wymaga trochę hardcoding (np. Pisząc "WHERE" i "UPDATE"), ale przynajmniej ukrywa większość szczegółów implementacji z dala od rzeczywistej składni zapytania LINQ.

+0

Nie sądzę, można to zrobić w ramach jednej transakcji. – VoodooChild

Odpowiedz

2

Sprawdź DataClassesDataContext.ExecuteCommand ...

+0

Widziałem kilka przykładów tego - ale nie dotyczy to "hardcoding" SQL jako ciąg i przekazywanie go do metody ExecuteCommand? Uważam, że cały punkt LINQ-SQL polegał na usunięciu podstawowych informacji z bazy danych. – RPM1984

+0

Masz rację. Jedynym powodem jest tutaj wydajność. Nie musisz pobierać wszystkich danych do aplikacji i wracać po prostu do prostej aktualizacji. Jeśli masz więcej niż 100 jednostek, różnica będzie bardzo duża ... – Marko

+0

Tak - wydaje się, że jest to jedyny sposób na zrobienie tego. Byłem zasmucony widząc ten problem również istnieje w EF. – RPM1984

Powiązane problemy