【发布时间】:2020-05-08 02:01:19
【问题描述】:
下面是我要优化的查询:-
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 是登录用户的所有语言 id 的列表
【问题讨论】:
-
取决于 EF 的版本。某些核心版本不会将所有内容都转换为 SQL。
-
@juharr 我的应用中有 ef 6
-
EF 6 的查询应该没有问题,.Any() 将被转换为 (... WHERE EXISTS(...)) 子查询
标签: c# sql entity-framework linq