2017-04-27 68 views
0

我在.NET核心Web API轉換數據庫實體的集合,以視圖模型

到目前爲止,我曾經在我的控制器返回匿名類型,但現在我要開始使用招搖的全功率工作的集合自動記錄返回類型。

這導致我開始使用視圖模型。

但我努力在自動生成的數據庫模型類 和自動生成的放大視圖模型類之間進行轉換。

它適用於單個實例(請參閱下面控制器中的GetPerson方法),但在我想返回列表時失敗。

所以我的問題:

  1. 如何投/轉換視圖模型和數據庫模型之間的對象的集合/列表
  2. 是控制器的代碼是否正確?有更簡單/更短/更好的方式來進行轉換嗎? (我看了有關使用implicit operator

錯誤消息我得到:

 
Cannot implicitly convert type 'System.Linq.IQueryable' to 'System.Collections.Generic.List'. An explicit conversion exists (are you missing a cast?) 

它給了我一個InvalidCastException如果我明確投他們像

List result = (List)_dbContext.Person....

似乎是一個問題與泛型在顯示器stackoverflow 假設我使用泛型列表與給定類型PersonView

我的代碼如下所示:

數據庫模型


    public partial class Person 
    { 
     public Person() 
     { 
     } 

     public int Id { get; set; } 
     public string Firstname { get; set; } 
     public string Lastname { get; set; } 
     public int? MainAdressId { get; set; } 

     public virtual Adress MainAdress { get; set; } 
    } 

    public partial class Adress 
    { 
     public Adress() 
     { 
      Person = new HashSet(); 
     } 

     public int Id { get; set; } 
     public string CityName { get; set; } 
     public int CityPostalCode { get; set; } 
     public string StreetName { get; set; } 
     public string HouseNumber { get; set; } 
     public string FloorNumber { get; set; } 
     public string DoorNumber { get; set; } 

     public virtual ICollection Person { get; set; } 
    } 

查看模型


    public class City 
    { 
     public string Name { get; set; } 
     public int PostalCode { get; set; } 
    } 

    public class Street 
    { 

     public string Name { get; set; } 
     public string HouseNumber { get; set; } 
     public string FloorNumber { get; set; } 
     public string DoorNumber { get; set; } 

    } 

    public class AdressView 
    { 
     public Street Street { get; set; } 
     public City City { get; set; } 

    } 

    public class PersonView 
    { 

     public string FirstName { get; set; } 

     public string Lastname { get; set; } 

     public AdressView Adress { get; set; } 

    } 

這是工作的一個實例控制器類而不是列出


using System.Collections.Generic; 
using System.Linq; 
using Microsoft.AspNetCore.Mvc; 
using Microsoft.EntityFrameworkCore; 
using Microsoft.Extensions.Logging; 
using Swashbuckle.SwaggerGen.Annotations; 
using PersonExample.ModelsPersonDB; 
using PersonExample.ModelsViewPerson; 

namespace PersonExample.Controllers 
{ 
    [Route("api/[controller]")] 
    public class PersonViewTestController : Controller 
    { 

     private readonly PersonDBContext _dbContext; 
     private readonly ILogger _logger; 

     public PersonViewTestController(PersonDBContext dbContext, ILogger logger) 
     { 
      _dbContext = dbContext; 
      _logger = logger; 
      _logger.LogDebug("{0} > new instance created", GetType().Name); 
     } 

     [HttpGet("{id:int}", Name = "GetPerson")] 
     [ProducesResponseType(typeof(PersonView), 200)] 
     [SwaggerOperation("GetPerson")] 
     public virtual IActionResult GetPerson([FromRoute]int id) 
     { 

      PersonView result = _dbContext.Person 
            .Include(p => p.MainAdress) 
            .Where(p => p.Id == id) 
            .Select(p => new PersonView() 
             { 
              FirstName = p.Firstname, 
              Lastname = p.Lastname, 
              Adress = (p.MainAdress == null) ? null : 
               new AdressView() 
               { 
                Street = new Street() 
                { 
                 Name = p.MainAdress.StreetName, 
                 HouseNumber = p.MainAdress.HouseNumber, 
                 FloorNumber = p.MainAdress.FloorNumber, 
                 DoorNumber = p.MainAdress.DoorNumber 
                }, 
                City = new City() 
                { 
                 Name = p.MainAdress.CityName, 
                 PostalCode = p.MainAdress.CityPostalCode 
                } 
               } 
             } 
            ) 
            .FirstOrDefault(); 

      return new ObjectResult(result); 
     } 

     [HttpGet(Name = "GetPersonList")] 
     [ProducesResponseType(typeof(List), 200)] 
     [SwaggerOperation("GetPersonList")] 
     public virtual IActionResult GetPersonList() 
     { 

      List result = _dbContext.Person 
            .Include(p => p.MainAdress) 
            .Select(p => new PersonView() 
            { 
             FirstName = p.Firstname, 
             Lastname = p.Lastname, 
             Adress = (p.MainAdress == null) ? null : 
               new AdressView() 
               { 
                Street = new Street() 
                { 
                 Name = p.MainAdress.StreetName, 
                 HouseNumber = p.MainAdress.HouseNumber, 
                 FloorNumber = p.MainAdress.FloorNumber, 
                 DoorNumber = p.MainAdress.DoorNumber 
                }, 
                City = new City() 
                { 
                 Name = p.MainAdress.CityName, 
                 PostalCode = p.MainAdress.CityPostalCode 
                } 
               } 
            } 
            ); 

      return new ObjectResult(result); 
     } 

    } 
} 

回答

1

我錯過了.ToList()在查詢結束。

完整的控制器知道的樣子:


[HttpGet(Name = "GetPersonList")] 
[ProducesResponseType(typeof(List), 200)] 
[SwaggerOperation("GetPersonList")] 
public virtual IActionResult GetPersonList() 
{ 

    List result = _dbContext.Person 
          .Include(p => p.MainAdress) 
          .Select(p => new PersonView() 
          { 
           FirstName = p.Firstname, 
           Lastname = p.Lastname, 
           Adress = (p.MainAdress == null) ? null : 
             new AdressView() 
             { 
              Street = new Street() 
              { 
               Name = p.MainAdress.StreetName, 
               HouseNumber = p.MainAdress.HouseNumber, 
               FloorNumber = p.MainAdress.FloorNumber, 
               DoorNumber = p.MainAdress.DoorNumber 
              }, 
              City = new City() 
              { 
               Name = p.MainAdress.CityName, 
               PostalCode = p.MainAdress.CityPostalCode 
              } 
             } 
          } 
          ).ToList(); //missed that line 

    return new ObjectResult(result); 
}
相關問題