[英]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; }
}
例如,我有一个user1
和user2
user1
选择聊天,其中聊天包含一个user2
我需要为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();
因此,您将拥有包含user1和user2以及聊天中用户总数的聊天。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.