Оптимизация запросов Entity Framework, пытаясь избежать - PullRequest
0 голосов
/ 08 мая 2020

Ниже приведен запрос, который я пытаюсь оптимизировать: -

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 - это список всех языковых идентификаторов авторизованного пользователя

1 Ответ

1 голос
/ 08 мая 2020

Any следует переводить в SQL. Можете ли вы проверить SQL, созданный EF, включив ведение журнала.

...