C# 如何为自引用多对多关系编写有效的LINQ查询?

C# 如何为自引用多对多关系编写有效的LINQ查询?,c#,entity-framework,linq,many-to-many,self-reference,C#,Entity Framework,Linq,Many To Many,Self Reference,我有以下模型,表示Person和“助手”(即另一个人)之间的自指多对多关系: 我如何通过一次LINQ呼叫实现这一点?在伪代码中,我要寻找如下内容: public Person GetAssistant(int assistedPersonId, int assistantId) { return = _context.People.Where( PERSONID == assistedPersonId AND

我有以下模型,表示Person和“助手”(即另一个人)之间的自指多对多关系:

我如何通过一次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));

从您的第一个代码片段开始,您只是返回助手,对吗?那么为什么不直接查询
\u context.People.Where(p=>p.Id==assistantId)
。助理的身份并不重要,因为你需要助理。你可以用它来做一个精神检查(助理真的是助理的助手吗?)-但这和加载这个人是分开的。你是对的,但是是的,我想我用它来做一个精神检查。当查看一个人的详细信息页面时,可以将其视为从UI启动的东西。我想列出该人员可能拥有的所有助手,然后我可能想单击某个特定助手以查看模式详细信息。只有当某个助手确实是某个特定人员的助手时,精神健康检查才能确保该助手被拉起。啊。。。复杂的语言,希望这有意义。:-)在这种情况下,我会编写类似于
\u context.People.Where(p=>p.Id==assistantId&&p.AssistantTo.Any(pa=>pa.AssistedPersonId==AssistedPersonId))
的代码,这很有效。答案往往比我想象的要简单。:-)如果你把这个作为一个答案(而不是评论),我会非常乐意把它标记为官方的“答案”。谢谢你。不用担心,伙计,很高兴它有帮助:)谢谢。小修正。由于
AssistantTo
包含个人实体的集合,因此实际上是:
p.AssistantTo.Any(pa=>pa.Id==assistedPersonId)
_context.People.FirstOrDefault(p => p.Id == assistantId);
_context.People.FirstOrDefault(p => p.Id == assistantId && 
                        p.AssistantTo.Any(pa => pa.Id == assistedPersonId));