LINQ, где пункт - PullRequest
       8

LINQ, где пункт

1 голос
/ 13 ноября 2010

У меня следующий запрос linq

var ret = from u in MenuHeaders
   .Include("MenuHeaderItems.MenuItem")                 
   select u;

Мне нужно выбрать ТОЛЬКО заголовки меню, которые существуют для определенных пользователей, которые принадлежат к определенной роли с учетом идентификатора пользователя.

Итак, реляционный путь будет примерно таким ...

MenuHeader    RoleMenuHeaders   Roles      UserRoles   Users
----------    ---------------   -----      ---------   -----
ID        <---MenuHeaderID  |-> ID <---|   UserID----->ID
              RoleID -------|          |-- RoleID

Как мне получить мой запрос выше, чтобы вернуть только MenuHeaders где UserID = 1?

Ответы [ 3 ]

1 голос
/ 13 ноября 2010

Если вы используете LINQ to Entities, это отношение, вероятно, автоматически сопоставляется через свойства, и (если предположить, что это отношения многие-ко-многим, как они отображаются в схеме, которую вы показываете), вы можете воспользоваться преимуществамиЛюбой оператор:

var ret = from mh in MenuHeaders.Include("MenuHeaderItems.MenuItem")      
   where mh.Roles.Any(r => r.Users.Any(u => u.UserId == 1))
   select mh;
0 голосов
/ 18 ноября 2010

Добавление предложения where, которое ссылается на объединенную таблицу, изменяет результирующий запрос и делает недействительным параметр Include.

Проверьте это. Как сделать включение действительно включенным.

0 голосов
/ 13 ноября 2010

Ну, вы можете сделать это с помощью объединения:

var ret = from mh in MenuHeaders.Include("MenuHeaderItems.MenuItem")
          join ur in UserRoles on mh.RoleID equals u.RoleID
          where ur.UserID == 1
          select mh;

(Я не знаю, нужен ли вам Include("UserRoles.UserRole") или что-то в этом роде. Я не знаю, какого поставщика LINQ вы используете.)

...