解析JSON数组以建模.NET Core导致空集

问题描述

通过调用DbSet<T>.FromsqlRaw(),我可以在数据库调用存储过程,该存储过程返回如下结果集:

Id VARCHAR(36)
FirstName VARCHAR(255)
LastName VARCHAR(255) NULL
Email VARCHAR(255) NULL
Numbers VARCHAR(?) NULL

Numbers一个VARCHAR字段,其中包含SearchContactsNumber的JSON数组:

public sealed class SearchContactsNumber
{
    public Guid IdNumber { get; set; }
    public string Type { get; set; }
    public string Number { get; set; }
}

例如,结果集可能像这样:

"34f8d20f-21da-11eb-a249-de3268ec1e72" | "Paul" | "Newman" | "paul.newman@gmail.com" | "[{"IdNumber":"481d2957-21da-11eb-a249-de3268ec1e72","Type":"Telephone","Number":"+440001122333"},{...},{...}]"

调试TestController.Index端点:

public sealed class SearchContacts
{
    public Guid IdContact { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Company { get; set; }
    public IEnumerable<SearchContactsNumber> Numbers { get; set; }
}

public class TestController : Controller
{
    private readonly DbContext _context;

    public TestController(DbContext context)
    {
        _context = context;
    }

    public IActionResult Index()
    {
        var set = _context.SearchContacts.FromsqlRaw<SearchContacts>($"CALL `SearchContacts`()");
        return Ok(set.ToList());
    }
}

返回:

enter image description here

如何归档json字符串的完整绑定?

我正在Pomelo.EntityFrameworkCore.MysqL (3.2.3)和ASP.NET Core 3.1 MVC项目中的MysqL 8数据库一起使用。

解决方法

Pomelo于几周前推出了全栈JSON支持,该支持在最新的Pomelo版本中可用,并将继续使用(以前的方法(如JsonObject<T>已被弃用,5.0中未正式支持) +)。

要使用它,您需要添加以下软件包之一,具体取决于要在引擎盖下使用的堆栈:

  • Pomelo.EntityFrameworkCore.MySql.Json.Microsoft
  • Pomelo.EntityFrameworkCore.MySql.Json.Newtonsoft

这些程序包支持POCO类,特定于堆栈的DOM API和简单的字符串映射。

我们还支持从JSON实体的仅顶级(非常快)到完整(较慢)更改跟踪的任何内容(可以通过options和{{1的UseMicrosoftJson()参数进行控制}}方法。

这是一个完全正常工作的控制台示例项目,该示例演示了如何针对您的特定情况(此处使用Microsoft堆栈)使用Pomelo的全栈JSON支持:

UseNewtonsoftJson()
,

如果将其设为JsonObject,则序列化将自动完成。 JsonObject位于系统命名空间下,Pomelo.EntityFrameworkCore.MySql支持它100%

请参见下面的代码

using System;

public sealed class SearchContacts
{
    public Guid IdContact { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Company { get; set; }
    public JsonObject<SearchContactsNumber[]> Numbers { get; set; }

    public SearchContactsNumber[] GetNumbers()
    {
        return Numbers.Object;
    }
}

请参阅:How to use JsonObject of Pomelo.EntityFramework

,

您可以尝试以下操作:

    public sealed class SearchContacts
    {
        public Guid IdContact { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Company { get; set; }
        public IEnumerable<SearchContactsNumber> Numbers { get; private set; }
        private string NumbersJson { set => Numbers = JsonConvert.DeserializeObject<IEnumerable<SearchContactsNumber>>(value); }
    }

只需确保将Numbers属性映射到NumbersJson

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...