Linq: результаты проекта - PullRequest
       1

Linq: результаты проекта

0 голосов
/ 21 октября 2011

В принципе, у меня много компаний, которые могут иметь много офисов, как мне получить мой запрос, чтобы показать это, у меня есть: Проблема (или мне так кажется), я получаю компанию 3 раза (пример ниже), когда мне нужно получить только одну компанию и несколько офисов, мой запрос просто неверен?

//companies = _repo.All<Companies>();
//mainoffice = _repo.All<Office>();

        var dto = companies
           .Join(mainoffice, x => x._ID, y => y.CompanyID, (x, y) => new
            {
                mycompany = x,
                myoffice = y,
            })
            .Select(x => new
                {
                    ID = x.mycompany._ID,
                    Offices = x.myoffice
                }); 

enter image description here

Однако, если я присоединяюсь к группе, я получаю то, что хочу , но Я возвращаю компании, у которых нет офисов ...

  var dto = companies
           .GroupJoin(mainoffice, x => x._ID, y => y.CompanyID, (x, y) => new
            {
                mycompany = x,
                myoffice = y,
            })
            .Select(x => new
                {
                    ID = x.mycompany._ID,
                    Offices = x.myoffice
                }); 

Обновление: еще 1 вложенный набор результатов ...

        var areascovered = repo.All<OfficePostCode>();

        var filter = repo.All<PostCodeDistrict>()
            .Where(x => x.Region.StartsWith(postcode))
            .Join(areascovered, x => x.PostCodeID, y => y.PostCodeID, (x, y) =>
                 new
                 {
                     Postcode = x.PostCode,
                     Region = x.Region,
                     OfficeID = y.OfficeID
                 });

        var mainoffice = repo.All<Office>();

        var dto = companies
            .Select(company => new
            {
                ID = company._ID,
                Offices = mainoffice.Select(office => new
                {
                    CompanyID = office.CompanyID,
                    Name = office.Name,
                    Tel = office.Tel,
                    RegionsCovered = filter.Where(f => f.OfficeID == office.OfficeID)
                })
                .Where(y => y.CompanyID == company._ID)// && y.RegionsCovered.Any())
            })
            .Where(pair => pair.Offices.Any());

Ответы [ 2 ]

0 голосов
/ 21 октября 2011

Нет необходимости присоединяться к компании с офисом, в таком объединении вы видите каждую компанию с номером офиса, я думаю, вы можете попробовать ниже:

companies.SelectMany(x=>x.Offices).Select(x=>new {ID = x.CompanyID, Office = x})

или

offices.GroupBy(x=>x.CompanyID).Select( x=>new {ID = Key, Offices = x});

Я предположил, что у вас есть идентификатор компании в каждом офисе.

если вы также хотите иметь полную компанию, которую вы можете сделать

var officeGroups = 
    offices.GroupBy(x=>x.CompanyID).Select( x=>new {ID = Key, Offices = x});

var result = from c in companies
               join o in officeGroups on c.ID equals o.ID
               select new {Company = c, Offices = o.Offices};
0 голосов
/ 21 октября 2011

Вам не нужно объединение, вам просто нужен вложенный выбор. Попробуйте что-то вроде этого:

from company in companies
select new
{
   ID = company._ID,
   Offices = mainoffice.Where(office => office.CompanyID == company._ID)
}

Если вам не нужны записи с компаниями без офисов, попробуйте следующее:

from company in companies
let offices = mainoffice.Where(office => office.CompanyID == company._ID)
where offices.Any()
select new
{
   ID = company._ID,
   Offices = offices
}

Явная лямбда-версия (точечная запись):

Первый:

companies.Select(company => new
{
    ID = company._ID,
    Offices = mainoffice.Where(office => office.CompanyID == company._ID)
});

Компании без офисов, удалено:

companies.Select(company => new
{
    ID = company._ID,
    Offices = mainoffice.Where(office => office.CompanyID == company._ID)
})
.Where(pair => pair.Offices.Any());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...