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

C# 如何在LINQ查询中访问关联?,c#,linq,ado.net-entity-data-model,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; 我曾尝试过,但不幸失败,因为: v

我在这方面有问题(我是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;
我曾尝试过,但不幸失败,因为:

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
    };
有人能告诉我我做错了什么,或者带我到有更多信息的地方吗


非常感谢。

从这里开始:。

在linq中,您的加入看起来像这样

from c in cc.Contacts
join cg in c.ContactGroups on cg.Id equals c.Id

请看这里:

我个人发现在学习LINQ和LINQtoSQL方面都是一个很好的资源。也许这会对你有所帮助。

我会稍微改变一下,然后使用
联系人组
表开始你的查询。这样,您就可以“访问”所有3个表

from c in cc.ContactGroups
where c.GroupNameID == 1
select new {
    c.Contact.Forename,
    c.Contact.Surname, 
    c.Title,
    c.Group.GroupName
}
这里是在中生成的
SQL
(使用
linqtosql
,但是
EF
不会有太大的不同)-它几乎与您的查询完全相同

-- 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

你犯了什么错误?IntelliSense应该能够告诉您变量的类型,并且您应该能够从中找出它。Title应该是cg.Title。我改了,假设是打字错误。你的查询结果在哪些方面不令人满意?它不编译吗?它是否给出错误消息?乍一看,我觉得不错。在这种情况下不需要打开(和关闭),但除此之外,它看起来不错。当然,它不会对数据库执行实际的查询,除非您对结果进行迭代(可能是通过调用ToList()这样简单的方法)。您需要详细说明哪些不起作用。不完全正确,因为他没有直接从上下文加入ContactGroups。
c.ContactGroups
已经自动进行了加入。但您不必加入,因为该关系应该已经在模型中定义。这是真的。取决于延迟加载g/渴望加载..他也可以做抄送联系人。包括(“”)…对吗?懒惰/急切加载仅适用于select语句中未选择的实体。如果您在LINQ语句中遍历导航属性,并选择所有需要选择的内容,EF将加载您要求的内容。懒惰/急切加载仅适用于在select语句中选择完整实体且具有其他导航属性的实体你也想要但没有明确选择的财产。谢谢!这是一种“正确”的方式还是一种偷偷摸摸的方式?:)@Ichirichi-我认为这是正确的方式。它当然会生成“正确的”
sql
。我没有太多地使用EF,但我相信EF4内置了对
多对多
关系的支持(不确定它是否在早期版本中),在这里您可以取消联接表-但前提是联接表除了外键之外没有任何其他列。LINQtoSQL没有这种支持,所以这个解决方案是最简单的方法。