138 messaggi dal 10 settembre 2007
Ciao a tutti,
vorrei chiedervi come mai su select un po complesse con varie join tra tabelle con circa 50.000/100.000 records, LINQ risulti estremamente lento rispetto ad una stored procedure.

in oltre, secondo voi è congliabile utilizzare LINQ con grosse tabelle?

            var res = (from wc in context.BooksWishlistContents
                       join l in context.Books on wc.ean equals l.ean
                       join cs in context.ComingSoon on l.ean equals cs.Ean into csj
                       from csjoined in csj.DefaultIfEmpty()
                       where wc.id_wishlist == wishlist_id
                       select new view_Wishlist
                       {
                           ean = wc.ean,
                           id_book_catalog = l.id,
                           isbn = wc.ean,
                           title = l.title,
                           year = l.year,
                           publisher = l.Publishers.name == null ? string.Empty : l.Publishers.name,
                           total_owned = (from u in context.UsersLibraries_Contents where u.ean == wc.ean select u).Count(),
                           book_votes_counter = (from v in context.BooksVotes where v.ean == wc.ean select v.id).Count(),
                           csJoned = (csjoined == null)

                       }).ToList();
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

pierpaolo1982 ha scritto:

in oltre, secondo voi è congliabile utilizzare LINQ con grosse tabelle?

Sì, purché tu tenga d'occhio la query SQL che il provider sta generando.
Se usi il DbContext, ti basta fare un .ToString sulla query LINQ per capire quale SELECT verrà inviata al db.

Nel tuo caso, hai creato una query LINQ molto convoluta, che probabilmente si tradurrà in una SELECT con molte subqueries. Sono loro la causa della lentezza: il server deve prima calcolarsi una tabella di risultati, metterla da una parte e poi proseguire unendola ad altre tabelle di risultati.


from csjoined in csj.DefaultIfEmpty()

Capisco che tu abbia voluto simulare una LEFT OUTER JOIN ma con LINQ To Entities non è necessario farlo perché puoi già accedere alle entità correlate Books e ComingSoon dalle proprietà di navigazione di BooksWishlistContents.

Ecco un articolo che ti spiega il problema:
Don't use LINQ join's. Navigate!

La tua query probabilmente potrebbe essere riscritta in maniera più semplice, ammesso che le relazioni tra le entità BooksWishlistContents, Books e ComingSoon siano state mappate correttamente (cioè esiste un vincolo di foreign key).

Vedrai che la query SQL generata sarà molto più pulita (controllalo di nuovo invocando il ToString) e quindi le prestazioni miglioreranno.

ciao,
Moreno

Enjoy learning and just keep making
138 messaggi dal 10 settembre 2007
Grazie, sei stato molto esplicativo!
Pierpaolo

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.