ASP.NET Web Api连接两个表以创建对象数组

Hap*_*nut 3 c# linq entity-framework asp.net-web-api

这可能是已经提出的问题,但是我仍然无法解决我的问题。我什至不知道我走的路是否正确。一些帮助将不胜感激。

我在ASP.NET Web API项目中有两个模型类,如下所示:

namespace Artists.Models
{
    public class Artist
    {
        public int ArtistID { get; set; }
        public string ArtistName { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

和:

namespace Artists.Models
{
    public class Project
    {
        public int ProjectID { get; set; }
        public string ProjectName { get; set; }
        public int ArtistID { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这在中创建了两个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
            };
}
Run Code Online (Sandbox Code Playgroud)

在Postman中返回以下输出:

[
    {
        "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"
    }
]
Run Code Online (Sandbox Code Playgroud)

但我希望输出是这样的:

[
    {
        "name": "Jack",
        "projects": ["ProjectOne"]
    },
    {
        "name": "Mike",
        "projects": ["ProjectTwo", "ProjectThree"]
    },
    {
        "name": "John",
        "projects": ["ProjectFour", "ProjectFive"]
    },
]
Run Code Online (Sandbox Code Playgroud)

我什至靠近吗?我知道这可能是一个问题,但我真的不知道。

mwi*_*ski 6

查询语法

如果你想使用保留查询语法,你可以加入到集合,然后投射其结果只返回ProjectNameartistProjects,即:

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)
            };

}
Run Code Online (Sandbox Code Playgroud)

方法语法

如果您想使用方法语法,请阅读以下内容。您可以将导航属性添加到Artist,即:

namespace Artists.Models
{
    public class Artist
    {
        public int ArtistID { get; set; }
        public string ArtistName { get; set; }
        public ICollection<Project> Projects { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后修改您的查询渴望负载(加入)ProjectsArtist

public IQueryable<Object> GetArtists()
{
    return db.Artists
            .Include(a => a.Projects)
            .Select(a => 
                new
                {
                    name = a.ArtistName,
                    projects = a.Projects.Select(p => p.ProjectName)
                });
}
Run Code Online (Sandbox Code Playgroud)

  • 杜德,我感激不尽。这帮助了我很多。我只是向您学习ICollection。再次感谢您,先生,祝您有愉快的一天。 (3认同)