c# - 用于在 SQL Server 中查询 JSON 字符串的 Entity Framework

标签 c# json entity-framework entity deserialization

我正在寻找任何在使用 Entity Framework 查询 JSON 字符串方面做过任何事情的人。

我应该简要介绍一下我在这里要做的事情。我正在使用的数据库用于我正在使用的工作流引擎。它处理所有工作流数据,还允许您将一些自定义数据存储为 JSON 字符串。我使用的工作流引擎在每个请求的基础上处理 JSON 字符串的序列化和反序列化,但如果我想根据 JSON 字符串中的值进行查询和过滤,我将不得不拉将整个表放入内存并反序列化所有条目,然后进行过滤。出于显而易见的原因,这是 Not Acceptable 。这样做的原因是,我们想要一个单一的工作流数据库,它可以用于所有使用该工作流引擎的应用程序,并且我们正在努力避免必须执行跨数据库 View 来分离应用程序特定的数据库以获取自定义数据。因为在大多数情况下,存储为 JSON 字符串的自定义请求数据相对简单,并且在大多数情况下查询时不需要,这是设计使然。但是如果我们确实需要进行自定义搜索,我们需要一种能够解析这些自定义 JSON 对象的方法。我希望这可以通过 Entity 动态完成,这样我就不必编写额外的存储过程来查询特定类型的对象。理想情况下,我只需要一个使用实体来允许查询任何 JSON 数据结构的库。

我从一个数据库函数开始,我发现它解析 JSON 并返回一个包含值(父对象 ID、名称、值和类型)的扁平化表。然后将该函数导入到我的实体模型中。这是我从哪里获得代码的链接。很有趣的文章。

Consuming JSON Strings in SQL Server

这是我所处位置的基础知识。

using (var db = new WorkflowEntities()) {
    var objects = db.Requests.RequestData();
}

在上面的代码示例中,Request 对象是我的基本工作流 Request 对象。 RequestData() 是类型的扩展方法

DbSet<Request>

parseJSON 是我的数据库函数的名称。

我的计划是编写一系列扩展方法来过滤可查询对象

IQueryable<parseJSON_result>

例如,如果我有一个看起来像这样的对象。

RequestDetail : {
    RequestNumber: '123',
    RequestType: 1,
    CustomerId: 1
}

我可以做类似的事情

db.Request.RequestData().Where("RequestType", 1);

或类似的东西。 .Where 方法将采用 RequestData(),这是一个包含已解析 JSON 的 IQueryable,它将过滤并返回新的 IQueryable 结果。

所以我的问题是,有人做过这样的事吗?如果是这样,你采取了什么样的方法?我的初衷是想做一些字典式的东西,但是好像太难了。任何想法,想法,建议,智慧,将不胜感激。我在这方面工作了一段时间,我觉得我真的没有走那么远。这主要是因为我无法决定语法的外观,而且我不确定是否应该在数据库方面做更多的工作。

这是我最初的语法想法,但我无法在不对对象进行水合的情况下运行 [] 运算符。

db.Request.Where(req => req.RequestData()["RequestType"] == 1).Select(req => req.RequestData()["CustomerInfo"]);

我知道这是一篇很长的文章,所以如果您已经读到这里,感谢您花时间阅读整篇文章。

最佳答案

从 SQL Server 2016 开始,存在 FOR JSON 和 OPENJSON,等同于 FOR XML 和 OPENXML。您可以对引用存储在 NVARCHAR 列中的 JSON 的表达式建立索引。

关于c# - 用于在 SQL Server 中查询 JSON 字符串的 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17439586/

相关文章:

entity-framework - ASP.NET 核心标识错误 : Entity type 'AppUserLogin' is defined with a single key property, 但 2 个值已传递给 'DbSet.Find' 方法

c# - 反序列化抽象类

c# - 如何在 Orchard 中设置自定义 Controller 工厂?

c# - MVVM 属性取决于对象图

ios - 什么情况下JSONSerialization.data(withJSONObject :) throw a catchable error?

json - 设计 REST - 保存大量相关实体

c# - 如何修复 'No property or field exists in type' 错误?

c# - XML 文档 SelectSingleNode 返回 null

javascript - 不用 Jquery 获取远程 JSON?

c# - 异常类型 'System.ObjectDisposedException'