Ниже приведен запрос, который я пытаюсь оптимизировать: -
posts = ctx.Posts
.Include(x => x.User)
.Include(x => x.User.UserLanguageMappings)
.Include(x => x.Medias)
.Include(x => x.Medias.Select(y => y.MediaUserViews))
.Include(x => x.PollOptions)
.Include(x => x.Comments)
.Include(x => x.TurnOffNotifications)
.Include(x => x.SharedParent)
.Include(x => x.SharedParent.User)
.Include(x => x.ExtendedPostList.Select(extendedPost => extendedPost.Medias))
.Where(x => x.IsDeleted == false
&& x.Group_Id == null
&& x.ParentPost_Id == null
&& (myFollowingsIds.Contains(x.User_Id)
|| x.Visibility == (int)PostVisibilityTypes.Public
&& x.User.UserLanguageMappings.Any(y => UserLanguageIds.Contains(y.LanguageId))) //using any here
&& !BlockedUsers.Contains(x.User_Id)
&& !HideAllUsersIds.Contains(x.User_Id)
&& !HidePostsIds.Contains(x.Id)
&& !ReportPostsIds.Contains(x.Id)
&& (x.Visibility != (int)PostVisibilityTypes.OnlyMe ||
x.Visibility == (int)PostVisibilityTypes.OnlyMe &&
x.User_Id == userId)
&& (x.IsPoll ? x.PollExpiryTime >= DateTime.UtcNow : true))
.OrderByDescending(x => x.Id)
.Skip(Math.Abs(PageNo - 1) * PageSize)
.Take(PageSize)
.ToList();
Мои проблемы с этим запросом:
Насколько я понимаю EF, все после Any()
будет не может выполняться в базе данных, и это, конечно, не очень эффективно. Я ищу альтернативный подход, при котором весь запрос выполняется в базе данных, и любые другие способы, которыми я могу оптимизировать этот запрос.
Модель UserLanguageMapping: -
public partial class UserLanguageMapping
{
public int Id { get; set; }
public int UserId { get; set; }
public int LanguageId { get; set; }
}
UserLanguageIds - это список всех языковых идентификаторов авторизованного пользователя