在 Linq 中,如何根据 child 记录进行查询?
In Linq, how do you query based on a child record?
我有一个简单的 parent/child 结构,用于存储用户发送消息的历史记录。我生成了一个 dbContext 并链接了所有实体(使用 EF Core Power Tools)。
那么,当 UserID 在 child table(称为 PushNotificationReceipients)中时,我如何才能真正获得某个 UserID 的所有通知?
我以为我可以做这样的事情,但它失败并出现错误:
var recipient = new PushNotificationRecipient();
recipient.UserId = userId;
var results = _dbContext.PushNotifications
.Include(t => t.PushNotificationContents)
.Where(t => t.PushNotificationRecipients.Contains(recipient))
.ToList();
..但这给出了错误
The LINQ expression could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable()
..客户评价会太慢
在 Linq 中有什么方法可以做到这一点,还是我需要直接传入 SQL?
Where
中的表达式存在两个主要问题:
正如异常消息告诉您的那样,该表达式无法转换为 SQL。
即使它可以翻译成 SQL,.Contains()
仍然会 return 错误。那是因为您创建的新 PushNotificationRecipient
对象与集合中的对象不同。仅仅因为它具有相同的 id 并不能使两个对象相等。
尝试如下操作:
var results = _dbContext.PushNotifications
.Include(t => t.PushNotificationContents)
.Where(t => t.PushNotificationRecipients.Any(r => r.UserId == userId))
.ToList();
你可以尝试使用ThenInclude,它是用来加载相关数据的
var recipient = new PushNotificationRecipient();
recipient.UserId = userId;
var results = _dbContext.PushNotifications
.Include(t => t.PushNotificationContents)
.ThenInclude(t => t.PushNotificationRecipients)
.Where(notification => notification.<your condition>)
.ToList();
我有一个简单的 parent/child 结构,用于存储用户发送消息的历史记录。我生成了一个 dbContext 并链接了所有实体(使用 EF Core Power Tools)。
那么,当 UserID 在 child table(称为 PushNotificationReceipients)中时,我如何才能真正获得某个 UserID 的所有通知?
我以为我可以做这样的事情,但它失败并出现错误:
var recipient = new PushNotificationRecipient();
recipient.UserId = userId;
var results = _dbContext.PushNotifications
.Include(t => t.PushNotificationContents)
.Where(t => t.PushNotificationRecipients.Contains(recipient))
.ToList();
..但这给出了错误
The LINQ expression could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable()
..客户评价会太慢
在 Linq 中有什么方法可以做到这一点,还是我需要直接传入 SQL?
Where
中的表达式存在两个主要问题:
正如异常消息告诉您的那样,该表达式无法转换为 SQL。
即使它可以翻译成 SQL,
.Contains()
仍然会 return 错误。那是因为您创建的新PushNotificationRecipient
对象与集合中的对象不同。仅仅因为它具有相同的 id 并不能使两个对象相等。
尝试如下操作:
var results = _dbContext.PushNotifications
.Include(t => t.PushNotificationContents)
.Where(t => t.PushNotificationRecipients.Any(r => r.UserId == userId))
.ToList();
你可以尝试使用ThenInclude,它是用来加载相关数据的
var recipient = new PushNotificationRecipient();
recipient.UserId = userId;
var results = _dbContext.PushNotifications
.Include(t => t.PushNotificationContents)
.ThenInclude(t => t.PushNotificationRecipients)
.Where(notification => notification.<your condition>)
.ToList();