Одна немедленная вещь: вы повторяете запрос 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?