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

7

实体数据模型

我在查询时遇到了问题(我是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
    };

请问有人能告诉我我做错了什么,或者指引我去哪里找更多信息吗?

非常感谢。


2
你遇到了什么错误?IntelliSense 应该能够告诉你变量的类型,然后你就能从那里弄清楚。 - Greg B
1
gc.Title 应该是 cg.Title。我已经更改了它,假设这是一个打字错误。 - Gage
2
你的查询结果有什么不满意的地方吗?它无法编译吗?它会给出错误信息吗?乍一看,它对我来说看起来是正确的。 - StriplingWarrior
2
在这种情况下,括号的开头和结尾并不是必需的,但除此之外看起来很好。当然,在迭代结果时(可能只需调用ToList()),它不会对数据库执行实际查询。您需要更详细地说明哪些部分出了问题。 - Ralph Shillington
4个回答

6
我会稍微调整一下你的查询,从使用ContactGroup表开始。这样,你就可以“访问”所有三个表。
from c in cc.ContactGroups
where c.GroupNameID == 1
select new {
    c.Contact.Forename,
    c.Contact.Surname, 
    c.Title,
    c.Group.GroupName
}

这是在 Linqpad 中生成的 SQL(使用 Linq to Sql,但 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

谢谢!这是“正确”的方法还是一种狡猾的方法? :) - PKCS12
@Ichirichi - 我认为这是正确的方法。它肯定会生成“正确”的sql。我没有经常使用EF,但我相信EF4内置了对“多对多”关系的支持(不确定是否在早期版本中),您可以摆脱连接表 - 但前提是连接表除了外键之外没有其他列。Linq to Sql没有此支持,因此此解决方案是最简单的方法。 - Geoff Appleford

1
在LINQ中,你的连接看起来像这样
from c in cc.Contacts
join cg in c.ContactGroups on cg.Id equals c.Id

看这里:http://www.dotnetperls.com/join


2
不太对,因为他没有直接从上下文中加入到ContactGroups。c.ContactGroups已经自动执行了一个连接。 - StriplingWarrior
1
你不应该加入它,因为关系应该已经在模型中定义好了。 - Gage
这是正确的。根据惰性加载/急切加载...他也可以做cc.Contacts.Include("")...对吗? - dknaack
懒加载/急加载仅适用于未在select语句中选择的实体。如果您在LINQ语句中遍历导航属性,并选择了所需的全部内容,则EF将加载您请求的内容。懒加载/急加载仅适用于在select语句中选择了完整实体并且它具有其他导航属性而您也需要这些属性但没有显式选择它们的情况。 - Adam Sills

1

我个人认为LINQPad是一个学习LINQ和LINQ-to-SQL的好资源。也许它能帮到你。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接