Как получить связанные данные с linq? - PullRequest
1 голос
/ 26 сентября 2019

У меня есть таблица Personnel и таблица PersonnelDrivingLicense .Существует несколько записей в таблице PersonnelDrivingLicense, связанных с одним персоналом.

Я пытался получить данные Personnel и PersonnelDrivingLicense с помощью linq, но я получаю 2 записи вместо 1.

Вот мой linqquery:

from p in Personnel
join pdl in PersonnelDrivingLicense on p.Id equals pdl.PersonnelId
select new Personnel
{
    Id = p.Id,
    PersonnelDrivingLicense = new List<PersonnelDrivingLicense>
    {
        new PersonnelDrivinLicense
        {
             Id = pdl.Id,
             DrivingLicenseClass = pdl.DrivingLicenseClass
        }
    }
}

Этот linq возвращает следующий результат:

Id: 1,
PersonnelDrivingLicense:
    Id: 1,
    DrivingLicenseClass: B

Id: 1,
PersonnelDrivingLicense:
    Id: 2,
    DrivingLicenseClass: C

Правильный результат должен быть ниже:

Id: 1,
PersonnelDrivingLicense:
    Id: 1,
    DrivingLicenseClass: B

    Id: 2,
    DrivingLicenseClass: C

Как я могу получить желаемый результат выше?Как мне написать правильный запрос linq?

Спасибо.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Вы должны сгруппировать возвращенные объекты персонала по Id.Попробуйте это:

from p in Personnel
join pdl in PersonnelDrivingLicense on p.Id equals pdl.PersonnelId
group p by p.Id into g
select new Personnel
{
    Id = g.Key,
    PersonnelDrivingLicense = g.Select(x => x.PersonnelDrivingLicense).ToList()
}
0 голосов
/ 26 сентября 2019

Если у вас есть отношение «один ко многим» или «многие ко многим», и вы хотите элемент с их подэлементами, вы должны использовать GroupJoin вместо «Join».

В вашем случае,у вас есть Personnel и PersonnelDrivingLicenses, вероятно, отношение один-ко-многим: каждый Personnel объект имеет ноль или более PersonnelDrivingLicences.Каждый PersonnelDrivingLicence принадлежит ровно одному Personnel объекту, а именно Personnel, на который ссылается внешний ключ PersonnelId.

Очевидно, вы хотите последовательность Personnel объектов, каждый Personnel объектсо списком его / ее PersonnelDrivingLicenses.

// GroupJoin Personnel with PersonnelDrivingLicenses
var personnelWithTheirDrivingLicenses = myDbContext.Personnel
    .GroupJoin(myDbDcontext.PersonnelDrivingLicenses,

    // from every personnel object take the Id,
    personnel => personnel.Id,
    // from every driving license take the PersonnelId
    personnelDrivingLicence => personnelDrivingLicence.PersonnelId,

    // Take the Personnel, with all his matching driving licenses to make a new:
    (personnel, drivingLicenses) => new
    {
        // for optimal efficiency, Select only the properties you plan to use:
        Id = personnel.Id,
        Name = personnel.Name,
        ...

        DrivingLicenses = drivingLicenses
            .Where(drivingLicense => ...) // only if you don't want all his DrivingLicenses
            .Select(drivingLicense => new
            {
                // again, select only the properties you plan to use:
                Id = drivingLicense.Id,
                Type = drivingLicense.Type,
                ...

                // not needed, you already know the value:
                // PersonnelId = drivingLicense.PersonnelId,
            })
            .ToList(),
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...