Autor Wątek: LINQ-to-SQL - optymalizacja zapytań bazodanowych  (Przeczytany 2798 razy)

Offline Asmodeusz

  • Użytkownik
    • Bogumił Wiatrowski: Blog

# Marzec 19, 2010, 10:56:58
Używam do komunikacji z bazą danych wygenerowanego przez VS zestawu klas LINQ-to-SQL. Wszystko niby działa ładnie, stabilnie, bezproblemowo, poza jednym przypadkiem. Mając wywołanie typu:
object[] arr = (from o in Database.Objects where
    (from x in Database.Another where o.ParentId == x.SomeUserData &&
        (from n in Database.UtilArray where n.AnotherId == x.id select true).FirstOrDefault())
    select x).Count() > 10
&& o.Parent == null select o.DisplayName).ToArray();
Całość wykonuje się nieproporcjonalnie długo do analogicznego, napisanego w T-SQL zapytania. Sprawdziłem logi bazy danych i wykonywanych jest dużo (rzędu dziesiątek tysięcy) zapytań. Całość oczywiście da się zawszeć w jednym zapytaniu.

Stąd pytanie: czy da się jakoś "przekonać" LINQ-to-SQL, żeby automatycznie generował zapytania korzystające m.in. z JOIN, COUNT i podobnych MSSQLowych słów kluczowych? W ostateczności: czy da się (cały czas korzystając m.in. z bufora LINQ, nie dokonującego zapisu do bazy do wywołania CommitTransaction() ) w sensowny sposób połączyć LINQ-to-SQL z ręcznie pisanymi zapytaniami?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Liosan

  • Redaktor

# Marzec 19, 2010, 11:09:46
ExecuteQuery ?  http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx

Czy to jest właśnie ten "niesensowny" sposób, który robi samoistnego commita? ;)

Liosan

Offline Asmodeusz

  • Użytkownik
    • Bogumił Wiatrowski: Blog

# Marzec 19, 2010, 13:35:02
ExecuteQuery ?  http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx

Czy to jest właśnie ten "niesensowny" sposób, który robi samoistnego commita? ;)

Liosan
Nie, nie, nie, nie zrozumieliśmy się. LINQ domyślnie wykonuje wszystkie selecty na bazie danych zaktualizowanej o zmiany wprowadzone w danej instancji połączenia po ostatnim CommitChanges(). Update/insert/delete nie są wykonywane na bazie, dopóki wspomniana metoda nie zostanie wywołana. I właśnie o to działanie (z cache'owaniem zmian) mi chodzi w przypadku ewentualnych własnych zapytań.

Offline Liosan

  • Redaktor

# Marzec 19, 2010, 14:57:00
Kurcze, to ja chyba dalej nie rozumiem :/ Jak to czego szukasz ma się do:

Cytuj
Custom SQL Expressions and Object Tracking for Updates

By default when you retrieve a data model object using LINQ to SQL, it will track all changes and updates you make to it.  If you call the "SubmitChanges()" method on the DataContext class, it will then transactionally persist all of the updates back to the database.  I cover this in more depth in Part 4 of this LINQ to SQL series.

One of the cool features of the ExecuteQuery() method is that it can fully participate in this object tracking and update model.  (...)

Because we typed the return value of our ExecuteQuery call in the GetProductsByCategory method to be of type "Product", LINQ to SQL knows to track the Product objects we returned from it.  When we call "SubmitChanges()" on the context object they will be persisted back to the database.
?

Liosan

Offline Asmodeusz

  • Użytkownik
    • Bogumił Wiatrowski: Blog

# Marzec 19, 2010, 15:53:20
Mea culpa, nie zauważyłem tego. Rzeczywiście częściowo rozwiązuje to problem :)

Natomiast główna kwestia: chciałbym uniknąć przepisywania połowy kodu obsługującego bazy danych z LINQ na SQL, jest jakieś rozwiązanie, które umożliwia automatyczne generowanie pojedynczych zapytań do bazy danych z "piętrowego" wywołania LINQ?

Offline JCoder

  • Użytkownik

# Maj 23, 2010, 14:36:27
Wow, to LINQ nie potrafi jednego rozbudowanego zapytania obiektowego zamieniać na jedno zapytanie SQLowe?
Jeśli to prawda, to już teraz wiem, żeby trzymać się od tego jak najdalej i używać NHibernate (albo jeszcze lepiej olać C# bo są lepsze języki do gadania z bazą danych, ale o tym psst, bo się znowu flame zrobi).
« Ostatnia zmiana: Maj 23, 2010, 14:41:19 wysłana przez JCoder »

Offline nilphilus

  • Użytkownik
    • wordpress

# Maj 23, 2010, 14:49:10
nom, pssst bo potrafi ;-)

 ale właśnie sam chciałem zasugerować NHibernate