如何在LINQ查询中访问关联?

Que*_*ner 7 c# linq ado.net-entity-data-model

实体数据模型

我在查询这个问题时遇到了问题(我是LINQ的新手,请原谅我),我花了几个小时在网上搜索.在SQL中我只想这样做

SELECT c.Forname, c.Surname cg.Title, g.GroupName
FROM Contact c
    inner join ContactGroup cg on cg.ContactID = c.ID
    inner join Group g on cg.GroupNameID = g.ID
WHERE g.ID=1;
Run Code Online (Sandbox Code Playgroud)

我曾经尝试过,但失败了,因为:

var result = 
    from c in cc.Contacts
    from cg in c.ContactGroups
    from g in cg.Group 
    where g.ID==1
    select new
    {
        c.Forename,
        c.Surname,
        cg.Title,
        g.GroupName
    };
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我做错了什么或指导我到某个地方获取更多信息吗?

非常感谢.

Geo*_*ord 6

我会稍微改变一下,然后使用ContactGroup表格开始查询.这样你就可以"访问"所有3个表.

from c in cc.ContactGroups
where c.GroupNameID == 1
select new {
    c.Contact.Forename,
    c.Contact.Surname, 
    c.Title,
    c.Group.GroupName
}
Run Code Online (Sandbox Code Playgroud)

这是SQL产生的Linqpad(使用Linq to SqlEF不会太不同) - 它几乎与您的查询完全一样.

-- Region Parameters
DECLARE @p0 Int = 1
-- EndRegion
SELECT [t1].[Forename], [t1].[Surname], [t0].[Title], [t2].[GroupName]
FROM [ContactGroups] AS [t0]
INNER JOIN [Contacts] AS [t1] ON [t1].[ID] = [t0].[ContactID]
INNER JOIN [Groups] AS [t2] ON [t2].[ID] = [t0].[GroupNameID]
WHERE [t0].[GroupNameID] = @p0
Run Code Online (Sandbox Code Playgroud)