Связывание Entity framework с сущностями

Раньше, когда я хотел получить связанные данные в sql-запросе, я соединял таблицы, однако теперь в linq to entity я хочу получить данные из таблицы, связанной с таблицей, через другую таблицу. Я не знаю, как выполнить такой запрос в linq to entity. Если бы кто-то мог помочь, это было бы хорошо.

Примером является таблица с именем person, которая имеет отношение к пользователям таблицы, что связано с ролями таблицы. Я хочу быть в состоянии получить человека, у которого есть определенная роль. Поскольку человек связан только с пользователем и косвенно через пользователя с ролью, я не уверен в запросе. Кроме того, использование свойств навигации не дает мне полного результата.

Любая информация будет хорошей. Вот пример структуры базы данных:

структура БД http://img194.imageshack.us/img194/4540/persons.jpg< /а>


person user125140    schedule 24.07.2009    source источник


Ответы (2)


Если вы используете генератор в VS (т. е. перетаскиваете таблицу данных, диаграмму и ключи, все они установлены в db), то то, что вы спрашиваете, может быть уже там автоматически.

e.g.

from Person in Context.Persons
where Person.Name == "PETER PAN"
select Person.User.Role.RoleName;

Точное название нужно обратиться к генератору кода, но это идея. Linq to entity поможет сопоставить внешние ключи и те для вас.

Редактировать

На самом деле я не пробовал использовать include. Но в соответствии с методом msdn:include включение должно показывать объект иерархия для работы. Итак, чтобы ваш запрос работал, попробуйте:

from c in db.Persons.Include("aspnet_Users").Include("aspnet_Roles")
    where c.aspnet_Users.aspnet_Roles.RoleName == "Role" select c

И более того, вы будете рассматривать возможность старта с ролей?

from r in db.aspnet_Roles
where r.RoleName == "ROLE"
select r.aspnet_Users.Persons
person xandy    schedule 24.07.2009
comment
то, что я изначально искал, было всеми пользователями в определенной роли, а не ролью для каждого человека. Проблема с этим заключалась в том, что aspnet_Users.aspnet_Roles.RoleName по какой-то причине был недоступен... - person user125140; 24.07.2009
comment
Вы имеете в виду сопоставление всех пользователей, принадлежащих к определенной группе, верно? Не могли бы вы опубликовать больше здесь, чтобы увидеть, почему это не работает? - person xandy; 24.07.2009
comment
return (из c в db.Persons.Include(aspnet_Users), где c.aspnet_Users.aspnet_Roles.RoleName == Role select c); это то, что я запрашивал, RoleName, однако, похоже, не существует... (Роль - это просто заполнитель, я использую фактическую роль при запросе) - person user125140; 24.07.2009
comment
Я думал начать с ролей и решил, что это сработает, но я хотел вернуть человека. Хотя синтаксис для включения заключался в том, чтобы разместить связанные таблицы с использованием точечного синтаксиса, я попытаюсь использовать несколько методов включения. - person user125140; 24.07.2009
comment
Нет, это тоже бесполезно, вам придется думать, что есть решение для чего-то такого простого при использовании соединений sql. - person user125140; 24.07.2009
comment
Невозможно использовать параметр ролей, который вы предоставили, либо не можете перейти от aspnet_Users к Persons... - person user125140; 24.07.2009
comment
Просто мысль, проверяли ли вы правильность сущности? например, вы можете просто сделать (из u в db.aspnet_Users, где UserName = dfklds выберите u.Persons)? - person xandy; 24.07.2009
comment
(из u в db.aspnet_Users, где u.UserName == dfklds выбирает u.Persons) это работает да - person user125140; 25.07.2009

(from u in db.aspnet_Users.Include("Person") 
 from c in db.aspnet_Roles 
 where c.RoleName == "role" 
 select u.Persons);

Хотя получилось спасибо за попытку.

person user125140    schedule 25.07.2009
comment
все еще кажется немного неестественным писать что-то подобное после столь долгого написания sql... - person user125140; 25.07.2009
comment
return (из u в db.Persons из c в db.aspnet_Roles, где c.RoleName == select u); еще лучшая версия - person user125140; 25.07.2009
comment
Я использую Linq 2 Sql в течение некоторого времени, и для меня это вполне естественно (за исключением случаев, когда вам нужно подумать о производительности). Единственное существенное отличие заключается в том, что при использовании Linq старайтесь не думать в стиле sql, и ваш вопрос довольно необычен, и я уверен, что в Linq 2 Sql я никогда не сталкивался с такой ситуацией (и я даже никогда раньше не использовал Include) - person xandy; 25.07.2009