Хотя я согласен с тем, что разделение запросов улучшает читабельность, другое соображение заключается в том, что два запроса будут загружать все соответствующих данных в память перед фильтрацией и разбиением на страницы и т. Д. c. Это будет дорого на ресурсах сервера. Получив удар по отношениям, вы можете попробовать что-то вроде:
Task<IList<ChatParticipant>> GetParticipants(int chatId, int excludeUserId)
{
var chatParticipants = await Context.ChatParticipant
.Include(x => x.Chat)
.Include(x => x.Participant)
.Where(c => c.ParticipantId != excludeUserId
&& !Context.BlockedParticipant.Any(b =>
b.BlockedId == excludeUserId && b.Blocker.Id == c.ParticipantId))
.ToListAsync();
return chatPaticipants;
}
Я считаю, что метод также должен быть помечен как async
, чтобы упростить await
и избежать потенциального многопоточного доступа в DbContext. , Я не уверен на 100%, что уловил отношения между блокировщиком и участником, но это было то, что я мог вывести из исходных запросов. Объединение их в один запрос не способствует удобочитаемости, но позволяет избежать загрузки больших наборов в память перед чем-то вроде разбивки на страницы.