Объединение нескольких таблиц для возврата списка с помощью LINQ - PullRequest
0 голосов
/ 05 мая 2019

У меня есть заявление LINQ, которое я пытаюсь выяснить - я относительно новичок в этом, поэтому, пожалуйста, извините за мое невежество. Я хочу вернуть список людей, каждый из которых имеет список интересов.

Таблица person (p) присоединяется к таблице personperson (pi) с помощью p.id = pi.personid

Таблица личных интересов объединяется с таблицей интересов (i), pi.interestid - i.id.

    public class Persons
    {
        public int Id { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
...
        public IList<Interest> PersonInterests { get; set; }
    }

    public class Interest
    {
        public string InterestName { get; set; }
    }

Класс, который я возвращаю, - это человек, каждый со своим списком PersonInterests, заполненным 0 и многими интересами. Ниже приведенное ниже утверждение Linq возвращает данные, но каждая запись о человеке получает только один интерес, а лица с несколькими интересами дублируют свои данные, как показано под оператором linq

            var interests = _db.Interests;

            return (from p in _db.People
                    join i in _db.PersonInterests on p.Id equals i.PersonId
                    join s in _db.Interests on i.InterestId equals s.Id
                    select new Persons{
                        Id = p.Id,
                        FirstName = p.FirstName,
                        LastName = p.LastName,
                        Age = p.Age,
                        Address = p.Address,
                        City = p.City,
                        StateAbbrev = p.StateAbbrev,
                        ZipCode = p.ZipCode,
                        PersonInterests = (from r in interests where r.Id == i.InterestId select r).ToList()
                    }).ToList();

Результаты:

{"id":1,"lastName":"Alexander","firstName":"Carson","age":23,"address":"123 4th Street","city":"Jamestown","stateAbbrev":"NV","zipCode":"65465","personInterests":[{"id":1,"interestName":"Basketball"}],"photo":null}
{"id":1,"lastName":"Alexander","firstName":"Carson","age":23,"address":"123 4th Street","city":"Jamestown","stateAbbrev":"NV","zipCode":"65465","personInterests":[{"id":2,"interestName":"Camping"}],"photo":null},

Вместо этого я хотел бы, чтобы данные выглядели так:

{"id":1,"lastName":"Alexander","firstName":"Carson","age":23,"address":"123 4th Street","city":"Jamestown","stateAbbrev":"NV","zipCode":"65465","personInterests":[{"id":1,"interestName":"Basketball"}, {"id":2,"interestName":"Camping"}],"photo":null}

Я боролся с этим некоторое время, любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

сделай так

(from p in _db.People
    select new {
    Id = p.Id,
    FirstName = p.FirstName,
    LastName = p.LastName,
    Age = p.Age,
    Address = p.Address,
    City = p.City,
    StateAbbrev = p.StateAbbrev,
    ZipCode = p.ZipCode,
    Photo = p.Photo,
    Interests = (from i in _db.Interests
                    where i.PersonId == p.Id
                    select i.InterestName).ToList()
}).ToList();
0 голосов
/ 05 мая 2019

Итак, после долгих часов наблюдения я понял, что глупо пытаться сделать это в одном запросе.Я разделил это и заставил это работать.Сначала извлекали данные о человеке, затем для каждого человека строили их список, если это интересует.

    public async Task<IEnumerable<PersonResource>> GetPeople()
    {
        IEnumerable<PersonResource> people = await (from p in _db.People
              select new PersonResource
              {
                Id = p.Id,
                FirstName = p.FirstName,
                LastName = p.LastName,
                Age = p.Age,
                Address = p.Address,
                City = p.City,
                StateAbbrev = p.StateAbbrev,
                ZipCode = p.ZipCode,
                Photo = p.Photo,
                Interests = new List<string>()
              }).ToListAsync();

        foreach (PersonResource person in people)
        {
            person.Interests = (from iint in _db.Interests
                          join n in _db.PersonInterests on iint.Id equals n.InterestId
                          where n.PersonId == person.Id
                          select iint.InterestName).ToList();
        }

        return people;



        // return Mapper.Map<List<Person>, List<PersonResource>>(people);


    }
...