Ottimizzare Linq a SharePoint
-
28-10-2019 - |
Domanda
Ho tre elenchi su SharePoint 2010 e ho un codice di lavoro che ottiene gli elenchi e li mette in relazione. Il mio problema è che ci vogliono circa 15 secondi per caricare la mia pagina. Sono un principiante di rango con LINQ a SharePoint e Linq in generale. La mia domanda è: c'è un modo per far funzionare questo codice più veloce?
SeatingChartContext dc = new SeatingChartContext(SPContext.Current.Web.Url);
EntityList<Seating_chartItem> seatCharts = dc.GetList<Seating_chartItem>("seating_chart");
EntityList<UsersItem> users = dc.GetList<UsersItem>("users");
EntityList<Excluded_usersItem> exusers = dc.GetList<Excluded_usersItem>("excluded_users");
// EntityList<LogsItem> logs = dc.GetList<LogsItem>("logs");
List<Seating_chartItem> seatList = (from seat in seatCharts where seat.Room == 0 where seat.Floor == floor select seat).ToList();
List <UsersItem> usersList = (from user in users select user).ToList();
List <Excluded_usersItem> xusersList = (from xuser in exusers select xuser).ToList();
var results = from seat in seatList
join user in usersList on
seat.User_id equals user.User_id
where seat.Room == 0
where seat.Floor == floor
where !(from xuser in xusersList select xuser.User_id).Contains(user.User_id)
select new
{
sid = seat.Seat_id,
icon = seat.Icon,
topCoord = seat.Top_coord,
leftCoord = seat.Left_coord,
name = user.Name,
phone = user.Phone,
mobile = user.Mobile,
content = seat.Content
};
Il tempo che prende questo codice è frustrante, per non dire altro.
Grazie.
Soluzione
Una cosa immediata: stai ricollegando xusersList
Ogni volta all'interno del tuo join:
where !(from xuser in xusersList select xuser.User_id).Contains(user.User_id)
Invece invece estrarre prima gli ID utente (poiché questa è l'unica cosa di cui hai bisogno)
var xusersList = (from xuser in exusers select xuser.User_id).ToList();
Quindi usalo direttamente:
where !xusersList.Contains(user.User_id)
Ancora meglio: determina gli utenti validi prima della domanda:
usersList = usersList.Where( user => !xusersList.Contains(user.User_id))
.ToList();
Ora puoi semplicemente rimuovere completamente questo dove le condizioni dalla tua domanda.
Anche questi in cui le condizioni sembrano non necessarie:
where seat.Room == 0
where seat.Floor == floor
Da quando hai filtrato il tuo seatList
in questo modo già.
Detto questo, dovresti registrare alcuni dati sulle prestazioni per vedere ciò che richiede effettivamente più tempo: sta acquisendo gli elenchi di init o la tua query di join/LINQ effettiva?