如何为自引用多对多关系编写高效的 LINQ 查询?
How to write an efficient LINQ query for a self-referential many-to-many relationship?
我有以下模型,表示 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)
;
}
由于助手也是一个人,我们可以直接加载,而不需要通过AssistantTo
行获取。
查询简单地变成:
_context.People.FirstOrDefault(p => p.Id == assistantId);
但是,由于我们还包括业务逻辑(我们要确保该助手实际上是正确人员的助手)- 我们可以限制查询:
_context.People.FirstOrDefault(p => p.Id == assistantId &&
p.AssistantTo.Any(pa => pa.Id == assistedPersonId));
我有以下模型,表示 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)
;
}
由于助手也是一个人,我们可以直接加载,而不需要通过AssistantTo
行获取。
查询简单地变成:
_context.People.FirstOrDefault(p => p.Id == assistantId);
但是,由于我们还包括业务逻辑(我们要确保该助手实际上是正确人员的助手)- 我们可以限制查询:
_context.People.FirstOrDefault(p => p.Id == assistantId &&
p.AssistantTo.Any(pa => pa.Id == assistedPersonId));