2017-04-27 65 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); 
}
相关问题