在 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 中的表达式存在两个主要问题:

  1. 正如异常消息告诉您的那样,该表达式无法转换为 SQL。

  2. 即使它可以翻译成 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();