繁体   English   中英

在实体框架中过滤多对多关系中的数据

[英]Filtering Data in Many To Many Relationship in Entity Framework

我的项目中有一个简单的多对多关系模型。

这是我的课程:

public class AppUser{
   public string Id { get; set; }
   public string Name { get; set; }

   public List<AppUserBlogs> AppUserBlogs { get; set; }
}
public class Blog{
   public string Id { get; set;}
   public string Title { get; set;}
   public string Body { get; set;}

   public List<AppUserBlogs> AppUserBlogs { get; set; }
}

好的,我想在这里实现的是,我想检索所有博客,而不是用户已经拥有的博客。

我可以做相反的事情,即检索特定用户的博客列表,

public List<Blog> GetBlogsByUser(AppUser user)
{
     using (var context = new BlogContext())
     {
         var blogs = context.Blogs.AsQueryable();

         if (!string.IsNullOrEmpty(user.Id))
         {
               blogs =  blogs
                           .Include(i => i.AppUserBlogs)
                           .ThenInclude(i => i.AppUser)
                           .Where(i => i.AppUserChasses.Any(a => a.AppUser.Id == user.Id));
         }

         return blogs.ToList();
    }
}

我实际上需要这种方法的反面。 例如,假设我的博客表中有 20 个博客。 其中 4 个是 User-1 的博客。 (BlogId-1 -> UserId-1 | BlogId-2 -> UserId-1 等...)。

所以,从另一个角度来看,我想向用户 1 展示用户 1 没有的其他 16 个博客。

我希望我确实问清楚了...

感谢您的时间!

只需否定 where 子句:

.Where(i => !i.AppUserChasses.Any(a => a.AppUser.Id == user.Id));

我确实解决了这个问题,将方法更改为这个。 但我仍然不确定这是否是最好的解决方案..

public List<Blog> GetAllExceptUserBlogs(AppUser user)
{
     using (var context = new BlogContext())
     {                
         var allBlogs = context.Blogs
                               .Include(i => i.AppUserBlogs)
                               .ThenInclude(i => i.AppUser)
                               .ToList();
         var selectedUser = context.AppUsers
                                   .Include(i => i.AppUserBlogs)
                                   .ThenInclude(i => i.Blog)
                                   .Where(i => i.Id == user.Id)
                                   .FirstOrDefault();
         List<Blog> tempBlogList = new List<Blog>();

         foreach (var blog in allBlogs)
         {
              if(!selectedUser.AppUserBlogs.Select(i => i.Blog).Contains(blog))
              {
                   tempBlogList.Add(blog);
              }
         }

         return tempBlogList;               
    }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM