从继承自另一个类的类中获取数据

时间:2019-12-24 01:00:18

标签: c# api asp.net-core asp.net-web-api asp.net-web-api2

我一直在使用ASP.NET Core 3开发图书馆管理Web API。我有一个名为LibraryAsset的基类,另一个名为Book的类,Book类继承自LibraryAsset类。我使用EF核心CF工作流构建数据库,并为LibraryAsset创建了一个数据表,该数据表带有一个鉴别符列。

我对API进行了测试,以获取所有库资产,它返回了库资产,但是缺少某些属性。这些属性在Books类中。使用API​​调用时如何将这些属性添加到图书馆资产?

这是Book.cs类:

public class Book: LibraryAsset
    {
        public string ISBN { get; set; } 
        [Required]
        [StringLength(255)]
        public string Author { get; set; }
    }

这是LibraryAsset类

public class LibraryAsset
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public int YearPublished { get; set; }
        public float Cost { get; set; }
    }

这是我在测试API时得到的结果

{
    "id": 1,
    "title": "Children of Blood and Bone",
    "yearPublished": 2018,
    "cost": 8000
}

这是API的获取函数:

public async Task<IEnumerable<LibraryAsset>> GetAllAssets() {
      return await _context.LibraryAssets.ToListAsync();
}

2 个答案:

答案 0 :(得分:1)

您可以直接使用JsonConvert.SerializeObject返回JSON:

using Newtonsoft.Json;

public async Task<string> GetAllAssets() {
   return JsonConvert.SerializeObject(await _context.LibraryAssets.ToListAsync());
}

或者,您可以更改签名以返回Task<JsonResult>并执行return new JsonResult(await _context.LibraryAssets.ToListAsync());

答案 1 :(得分:0)

  

有一个名为LibraryAsset的基类和另一个名为Book的类,Book类继承自LibraryAsset类。我使用EF核心CF工作流构建数据库,并为LibraryAsset创建了一个数据表,该数据表带有一个鉴别符列。

     

对API进行测试以获取所有库资产,它返回库资产,但是缺少某些属性。

如果您想获取所有书籍,可以尝试:

await _context.Books.ToListAsync();

如果您想从数据库表LibraryAsset中获取所有资产,可以尝试:

public async Task<IActionResult> GetAllAssets()
{    
    using (var command = _context.Database.GetDbConnection().CreateCommand())
    {
        command.CommandText = "SELECT Id, Title, YearPublished, Cost, Discriminator, ISBN, Author FROM dbo.LibraryAsset";
        _context.Database.OpenConnection();

        using (var myDataReader = command.ExecuteReader())
        {
            var dt = new DataTable();
            dt.Load(myDataReader);

            var allAssets = dt.AsEnumerable().Select(s => new
            {
                Id = s.Field<int>("Id"),
                Title = s.Field<string>("Title"),
                YearPublished = s.Field<int>("YearPublished"),
                Cost = s.Field<float>("Cost"),
                ISBN = s.Field<string>("ISBN"),
                Author = s.Field<string>("Author")
            }).ToList();

            return Ok(allAssets);
        }
    }
}