2012-01-27 4 views
-2

У меня есть эта диаграмма БД и вы хотите сделать запрос, чтобы найти все Списки пользователей в данной области. RegionId поставляется.Комплекс Linq Collection Query

DB Diagram

Так что я могу получить все отделы этого кода (не может быть лучшим способом ..):

var region = context.Regions.Find(regionId); 
IEnumerable<Department> departments = region.Areas 
      .SelectMany(a => a.Workplaces) 
      .SelectMany(w => w.Departments); 

Счет может иметь много списков пользователей, и Учет может быть связан со многими Отделы. Может кто-то сформулировать запрос для достижения этого, пожалуйста?

+0

Я просто понял, что эта модель перепутались. Отделы> - <Учетных записей должно быть много для многих ... Эта диаграмма БД бесполезна :-( – Simon

+0

Диаграмма в данный момент правильная ... grr @ downvoters :(будет пытаться ответить ниже позже сегодня и скоро вернется. – Simon

ответ

-1

Вы можете использовать синтаксис let (или метод .Select) для навигации по отношениям ManyToOne.

var query = 
    from r in context.Regions 
    where r.RegionId == regionId 
    from a in r.Areas 
    from w in a.Workplaces 
    from d in w.Departments 
    from da in d.DepartmentAccounts 
    let acc = da.Account 
    from u in acc.UserLists 
    select u; 


var query2 = context.Regions.Where(r => r.RegionId == regionId) 
    .SelectMany(r => r.Areas) 
    .SelectMany(a => a.Workplaces) 
    .SelectMany(w => w.Departments) 
    .SelectMany(d => d.DepartmentAccounts) 
    .Select(da => da.Account) 
    .SelectMany(acc => acc.UserLists); 
+0

He просто хочу списки пользователей. –

+0

@ Саид Я не думаю, что вы хорошо разбираетесь в том, что он хочет. –

+0

OP судит: «У меня есть эта диаграмма DB и вы хотите сделать запрос, чтобы найти все списки пользователей в данном регионе» –

0

для полноты окончательный код был:

 List<UserList> query2 = context.Regions.Where(r => r.RegionId == regionId) 
      .SelectMany(r => r.Areas) 
      .SelectMany(a => a.Workplaces) 
      .SelectMany(w => w.Departments) 
      .SelectMany(d => d.AccountsAllowedToPost) 
      .Distinct() 
      .SelectMany(da => da.Lists).ToList();