繁体   English   中英

Linq Entity Framework核心中的多对多

[英]Linq Many to many in Entity Framework core

我有一些用于建立多对多关系的课程。

public class Chat 
{
    [Key]
    public Guid Id { get; set; }
    public ICollection<ApplicationUserChat> UserChats { get; set; }
}

public class ApplicationUserChat
{
    [Required]
    public string UserId { get; set; }
    public ApplicationUser User { get; set; }

    public Guid ChatId { get; set; }
    public Chat Chat { get; set; }
}

public class ApplicationUser : IdentityUser
{        
    public ICollection<ApplicationUserChat> UserChats { get; set; }       
}

例如,我有一个user1user2

  1. 我需要为user1选择聊天,其中聊天包含一个user2
  2. 我需要为user1选择聊天,其中聊天包含一个user2而不包含另一个用户(例如一个聊天仅包含2个参与者)

    如何通过对DB的一个请求在EF Core中做到这一点?

 var chats = user1.UserChats.Select(uc => uc.ChatId).Distinct();
 var result1 = context.ApplicationUserChat
       .Where(a => a.UserId == user2.Id && chats.Contains(a.ChatId))
       .Select(a => a.Chat)
       .ToList();
 var result2 = results1.Except(context.ApplicationUserChat
       .Where(a => a.UserId != user2.Id 
                   && a.UserId != user2.Id 
                   && chats.Contains(a.ChatId))
       .Select(a => a.Chat)
       .Distinct())
       .ToList();

//正在加载...使用/如果您已经有用户列表,则为简短版本:

 var result1 = user1.UserChat.Intersect(user2.UserChats);

如果对两种情况都可以对数据库执行两次查询以获取数据,则可以使用以下查询

//chats that contain user1 and user2
var chats1 = context
    .Chats
    .Where(c => c.UserChats.Any(u => u.UserId == userId1))
    .Where(c => c.UserChats.Any(u => u.UserId == userId2))
    .ToList();

//chats that contain user1 and user2 and they are only users in chat
var chats2 = context
    .Chats
    .Where(c => c.UserChats.Any(u => u.UserId == userId1))
    .Where(c => c.UserChats.Any(u => u.UserId == userId2))
    .Where(c => c.UserChats.Count() == 2)
    .ToList();

如果要在1个请求中检索所有数据,则可以声明一个新类,其中包含有关聊天的必要信息

public class ChatDto
{
    public Guid Id { get; set; }

    public int UserCount { get; set; }
}

并执行以下请求

var chats = context
    .Chats
    .Where(c => c.UserChats.Any(u => u.UserId == userId1))
    .Where(c => c.UserChats.Any(u => u.UserId == userId2))
    .Select(c => new ChatDto
    {
        Id = c.Id,
        UserCount = c.UserChats.Count()
    })
    .ToList();

因此,您将拥有包含user1user2以及聊天中用户总数的聊天。

暂无
暂无

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

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