Как получить массив JSON в качестве ответа от asp. net core web api - PullRequest
0 голосов
/ 27 апреля 2020

Привет, ребята. Я пытаюсь получить данные из нескольких таблиц в одном SQL запросе с использованием LINQ и Entity Framework. Мне нужно получить детали из базы данных. Есть несколько регионов.

1) Получить все регионы. 2) Получить все проекты в регионах. 3) получить все разделы в проектах.

Мне нужно получить все детали проекта из каждого региона на основе идентификатора региона.

public partial class Regions
    {
        public Regions()
        {
            Projects = new HashSet<Projects>();
            RegionUserRelation = new HashSet<RegionUserRelation>();
        }

        public int RegionId { get; set; }
        [Required]
        public string RegionName { get; set; }
        [Required]
        public string RegionFullname { get; set; }
        [Required]
        public int RegionTypeId { get; set; }
        public string RegionMisc { get; set; }

        public RegionType RegionType { get; set; }
        public ICollection<Projects> Projects { get; set; }
        public ICollection<RegionUserRelation> RegionUserRelation { get; set; }
    }

public partial class Projects
    {
        public Projects()
        {
            Sections = new HashSet<Sections>();
        }

        public Guid ProjectId { get; set; }
        [Required]
        public string ProjectName { get; set; }
        [Required]
        public string ProjectCode { get; set; }
        public string ProjectDesc { get; set; }
        [Required]
        public int RegionId { get; set; }
        [Required]
        public int EpsgId { get; set; }

        public Epsg Epsg { get; set; }
        public Regions Region { get; set; }
        public ICollection<Sections> Sections { get; set; }
    }


public partial class Sections
    {
        public Sections()
        {
            Flights = new HashSet<Flights>();
        }

        public Guid SectionId { get; set; }
        [Required]
        public string SectionName { get; set; }
        public string SectionDesc { get; set; }
        [Required]
        public Guid ProjectId { get; set; }

        public Projects Project { get; set; }
        public ICollection<Flights> Flights { get; set; }
    }

Ожидаемый результат:

{ "Regions" : 
  [ { 
        "region_id" : "2012",
        "region_name" : "region1",
        "region_fullname" : "21700",
        "region_type" : "MERCH",
            "Projects" : [ 
               {     "project_id" : 2341,
                     "project_name " : "DXY",
                     "project_code " : "21700",
                     "sections" : [
                                { "section_id" : 4356,
                                "section_name" : sec_name,
                                "section_description" : sec_dis},
                                { "section_id" : 476,
                                "section_name" : sec_name2,
                                "section_description" : sec_dis2},
                                { "section_id" : 908,
                                "section_name" : sec_name3,
                                "section_description" : sec_dis3}
                            ]
                },
            "Projects" : [ 
               {     "project_id" : 1321,
                     "project_name " : "Proj_2",
                     "project_code " : "01700",
                     "sections" : [
                                { "section_id" : 4356,
                                "section_name" : sec_name,
                                "section_description" : sec_dis},
                                { "section_id" : 476,
                                "section_name" : sec_name2,
                                "section_description" : sec_dis2},
                                { "section_id" : 908,
                                "section_name" : sec_name3,
                                "section_description" : sec_dis3}
                            ]
                },
            ]
  },
  { 
        "region_id" : "2013",
        "region_name" : "region3",
        "region_fullname" : "21330",
        "region_type" : "MERCH",
            "Projects" : [ 
               {     "project_id" : 2341,
                     "project_name " : "DXY",
                     "project_code " : "21700",
                     "sections" : [
                                { "section_id" : 4356,
                                "section_name" : sec_name,
                                "section_description" : sec_dis},
                                { "section_id" : 476,
                                "section_name" : sec_name2,
                                "section_description" : sec_dis2},
                                { "section_id" : 908,
                                "section_name" : sec_name3,
                                "section_description" : sec_dis3}
                            ]
                },
            "Projects" : [ 
               {     "project_id" : 1321,
                     "project_name " : "Proj_2",
                     "project_code " : "01700",
                     "sections" : [
                                { "section_id" : 4356,
                                "section_name" : sec_name,
                                "section_description" : sec_dis},
                                { "section_id" : 476,
                                "section_name" : sec_name2,
                                "section_description" : sec_dis2},
                                { "section_id" : 908,
                                "section_name" : sec_name3,
                                "section_description" : sec_dis3}
                            ]
                },
            ]
  },
  { 
        "region_id" : "2012",
        "region_name" : "region2",
        "region_fullname" : "24300",
        "region_type" : "MERCH",
            "Projects" : [ 
               {     "project_id" : 2341,
                     "project_name " : "DXY",
                     "project_code " : "21700",
                     "sections" : [
                                { "section_id" : 4356,
                                "section_name" : sec_name,
                                "section_description" : sec_dis},
                                { "section_id" : 476,
                                "section_name" : sec_name2,
                                "section_description" : sec_dis2},
                                { "section_id" : 908,
                                "section_name" : sec_name3,
                                "section_description" : sec_dis3}
                            ]
                },
            "Projects" : [ 
               {     "project_id" : 1321,
                     "project_name " : "Proj_2",
                     "project_code " : "01700",
                     "sections" : [
                                { "section_id" : 4356,
                                "section_name" : sec_name,
                                "section_description" : sec_dis},
                                { "section_id" : 476,
                                "section_name" : sec_name2,
                                "section_description" : sec_dis2},
                                { "section_id" : 908,
                                "section_name" : sec_name3,
                                "section_description" : sec_dis3}
                            ]
                },
            ]
  },
] }

Я пробовал этот, но он дает только одну запись для региона. Мне нужен весь регион и весь проект из регионов

IList<Regions> ches = entities.Regions.Include
                        (c => c.Projects).ToList();
                    return Ok(ches);

output

[{"regionId":1,"regionName":"Mitte","regionFullname":"Region Mitte","regionTypeId":1,"regionMisc":"","regionType":null,"projects":[{"projectId":"9dd284be-004d-42ee-8e21-3acbb240c488","projectName":"EÜ Stockstadt","projectCode":"B-MI01007P","projectDesc":"","regionId":1,"epsgId":32632,"epsg":null

1 Ответ

0 голосов
/ 28 апреля 2020

Я пробовал этот, но он дает только одну запись для региона. Мне нужен весь регион и весь проект из регионов

Убедитесь, что ваша база данных содержит более одной записи.

Модель:

public partial class Regions
{
    public Regions()
    {
        Projects = new HashSet<Projects>();
    }
    [Key]
    public int RegionId { get; set; }
    [Required]
    public string RegionName { get; set; }
    [Required]
    public string RegionFullname { get; set; }
    [Required]
    public int RegionTypeId { get; set; }
    public string RegionMisc { get; set; }

    public ICollection<Projects> Projects { get; set; }
}

public partial class Projects
{
    public Projects()
    {
        Sections = new HashSet<Sections>();
    }
    [Key]
    public Guid ProjectId { get; set; }
    [Required]
    public string ProjectName { get; set; }
    [Required]
    public string ProjectCode { get; set; }
    public string ProjectDesc { get; set; }
    [Required]
    public int RegionId { get; set; }
    public Regions Region { get; set; }
    public ICollection<Sections> Sections { get; set; }
}

public partial class Sections
{
    [Key]
    public Guid SectionId { get; set; }
    [Required]
    public string SectionName { get; set; }
    public string SectionDesc { get; set; }
    [Required]
    public Guid ProjectId { get; set; }

    public Projects Project { get; set; }
}

Контроллер:

Из ожидаемого json вы также хотите загрузить модель Sections, связанную с Projects:

[Route("api/[controller]")]
[ApiController]
public class TestsController : ControllerBase
{
    private readonly YourDbContext _context;

    public TestsController(YourDbContext context)
    {
        _context = context;
    }

    // GET: api/Tests
    [HttpGet]
    public async Task<ActionResult<Regions>> GetTest()
    {

        IList<Regions> ches = _context.Regions.Include
                    (c => c.Projects).ThenInclude(c=>c.Sections).ToList();
        return Ok(ches);
    }
}

Startup.cs:

Для asp. net core 2.2:

services.AddMvc()
        .AddJsonOptions(options =>
             options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore)
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Для asp. net core 3. x:

services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

Результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...