Оптимизация LINQ для Sharepoint - PullRequest
0 голосов
/ 04 мая 2011

У меня есть три списка на Sharepoint 2010, и у меня есть рабочий код, который получает списки и связывает их. Моя проблема в том, что загрузка моей страницы занимает около 15 секунд. Я начинающий с LINQ to Sharepoint и LINQ в целом. Мой вопрос: есть ли способ заставить этот код работать быстрее?

                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
                                         };

Время, которое занимает этот код, расстраивает, если не сказать больше.

Спасибо.

1 Ответ

1 голос
/ 04 мая 2011

Одна немедленная вещь: вы повторяете запрос xusersList каждый раз в своем соединении:

where !(from xuser in xusersList select xuser.User_id).Contains(user.User_id)

Вместо этого просто сначала извлеките только идентификаторы пользователя (поскольку это единственное, что вам нужно)

var xusersList = (from xuser in exusers select xuser.User_id).ToList();

, затем используйте его напрямую:

  where !xusersList.Contains(user.User_id)

Еще лучше - определите действительных пользователей перед вашим запросом:

usersList = usersList.Where( user => !xusersList.Contains(user.User_id))
                     .ToList();

Теперь вы можете просто полностью удалить это условие условия из вашего запроса.

Кроме того, эти условия кажутся ненужными:

where seat.Room == 0
where seat.Floor == floor

, поскольку вы уже отфильтровали seatList таким образом.

Сказав, что вы должны зарегистрировать некоторые данные о производительности, чтобы увидеть, что на самом деле занимает больше времени - это получение начальных списков или ваш фактический запрос join / linq?

...