如何解决解析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());
}
}
返回:
如何归档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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。