Как получить доступ к ассоциациям в запросе LINQ? - PullRequest
7 голосов
/ 19 июля 2011

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;

Я пытался сделать это, но с треском провалился как:

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

Может кто-нибудь, пожалуйста, покажите мне, что я делаю неправильно, или направьте меня куда-нибудьс дополнительной информацией?

Большое спасибо.

Ответы [ 4 ]

6 голосов
/ 19 июля 2011

Я бы немного поменял вещи и начал бы свой запрос, используя таблицу ContactGroup.Таким образом, у вас есть «доступ» ко всем 3 таблицам.

from c in cc.ContactGroups
where c.GroupNameID == 1
select new {
    c.Contact.Forename,
    c.Contact.Surname, 
    c.Title,
    c.Group.GroupName
}

Вот SQL, полученный в Linqpad (с использованием 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
1 голос
/ 19 июля 2011

в linq ваше объединение выглядит так

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

смотрите здесь: http://www.dotnetperls.com/join

1 голос
/ 19 июля 2011

Лично я нашел LINQPad хорошим ресурсом для изучения как LINQ в целом, так и LINQ-to-SQL. Может быть, это поможет вам.

0 голосов
/ 19 июля 2011
...