如何为自引用的多对多关系编写高效的LINQ查询

本文关键字:高效 查询 LINQ 自引用 关系 | 更新日期: 2023-09-27 18:12:13

我有以下模型,表示Person和"Assistant"(只是另一个Person)之间的自引用多对多关系:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Person> Assistants { get; set; }
    public virtual ICollection<Person> AssistantTo { get; set; 
}

但是我在如何用LINQ有效地查询特定的助手时遇到了麻烦。我知道我可以这样做:

    public Person GetAssistant(int assistedPersonId, int assistantId)
    {
        var assistedPerson = _context.People.Where(p => p.Id == assistedPersonId)
            .Include(a => a.Assistants)
            .FirstOrDefault();
        return assistedPerson.Assistants.FirstOrDefault(a => a.Id == assistantId);
    }

我如何用一个LINQ调用实现这一点?在伪代码中,我正在寻找类似的东西:

    public Person GetAssistant(int assistedPersonId, int assistantId)
    {
        return = _context.People.Where(
            PERSONID == assistedPersonId AND 
                        PERSON HAS AN ASSISTANT WITH assistantId)
        ;
    }

如何为自引用的多对多关系编写高效的LINQ查询

由于助手也是一个人,我们可以直接加载它,而不必通过AssistantTo行获取它。

查询变成:

_context.People.FirstOrDefault(p => p.Id == assistantId);

然而,由于我们还包括业务逻辑(我们想要确保这个助手实际上是正确的人的助手)-我们可以限制查询:

_context.People.FirstOrDefault(p => p.Id == assistantId && 
                        p.AssistantTo.Any(pa => pa.Id == assistedPersonId));