ASP.NET Web Api объединяет две таблицы для создания массива объектов - PullRequest
0 голосов
/ 23 июня 2018

Возможно, это уже заданный вопрос, но я все еще не могу решить свою проблему.Я даже не знаю, нахожусь ли я на правильном пути.Некоторая помощь будет оценена.

У меня есть два класса моделей в проекте ASP.NET Web API, которые выглядят следующим образом:

namespace Artists.Models
{
    public class Artist
    {
        public int ArtistID { get; set; }
        public string ArtistName { get; set; }
    }
}

и:

namespace Artists.Models
{
    public class Project
    {
        public int ProjectID { get; set; }
        public string ProjectName { get; set; }
        public int ArtistID { get; set; }
    }
}

Это создало две таблицы SQL, соединенныеArtistID как внешний ключ в Project.

У меня есть этот код контроллера:

public IQueryable<Object> GetArtists()
{
     return from a in db.Artists
            join p in db.Projects on a.ArtistID equals p.ArtistID
            select new
            {
                account_name = a.ArtistName,
                project_name = p.ProjectName
            };
}

, который возвращает этот вывод в Почтальоне:

[
    {
        "name": "Jack",
        "project_name": "ProjectOne"
    },
    {
        "name": "Mike",
        "project_name": "ProjectTwo"
    },
    {
        "name": "Mike",
        "project_name": "ProjectThree"
    },
    {
        "name": "John",
        "project_name": "ProjectFour"
    },
    {
        "name": "John",
        "project_name": "ProjectFive"
    }
]

, ноЯ хочу, чтобы вывод был таким:

[
    {
        "name": "Jack",
        "projects": ["ProjectOne"]
    },
    {
        "name": "Mike",
        "projects": ["ProjectTwo", "ProjectThree"]
    },
    {
        "name": "John",
        "projects": ["ProjectFour", "ProjectFive"]
    },
]

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

1 Ответ

0 голосов
/ 23 июня 2018

Синтаксис запроса

Если вы хотите продолжать использовать синтаксис запроса , вы можете присоединиться к коллекции и затем спроецировать ее результаты, чтобы вернуть только ProjectName из artistProjects, то есть:

public IQueryable<Object> GetArtists()
{

    return from a in db.Artists
            join p in db.Projects on a.ArtistID equals p.ArtistID into artistProjects
            select new
            {
                name = a.ArtistName,
                projects = artistProjects.Select(ap => ap.ProjectName)
            };

}

Синтаксис метода

Если вы хотите использовать синтаксис метода , тогда читайте ниже.Вы можете добавить свойство навигации в Artist, например:

namespace Artists.Models
{
    public class Artist
    {
        public int ArtistID { get; set; }
        public string ArtistName { get; set; }
        public ICollection<Project> Projects { get; set; }
    }
}

Затем измените свой запрос на активную загрузку (объединение) Projects для Artist:

public IQueryable<Object> GetArtists()
{
    return db.Artists
            .Include(a => a.Projects)
            .Select(a => 
                new
                {
                    name = a.ArtistName,
                    projects = a.Projects.Select(p => p.ProjectName)
                });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...