11

我正在寻找任何使用实体框架查询 JSON 字符串的人。

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

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

在 SQL Server 中使用 JSON 字符串

这是我所在位置的基本信息。

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

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

DbSet<Request>

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

我的计划是编写一系列扩展方法来过滤 Queryables

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"]);

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

4

3 回答 3

2

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

于 2017-01-25T15:28:26.007 回答
2

这是一个非常晚的答案,但对于仍在搜索的任何人......

正如@Emyr 所说,SQL 2016 支持使用 JSON_VALUE 或 OPENJSON 语句在 JSON 列中进行查询。

实体框架仍然不直接支持这一点,但您可以使用 SqlQuery 方法直接对数据库运行原始 SQL 命令,该命令可以在 JSON 列中查询并保存查询和反序列化每一行以运行简单查询。

于 2017-10-28T00:36:10.167 回答
0

您可以做的是创建一个 CLR SQL Server 用户定义函数,然后从您的查询中使用它。

请参阅此链接https://msdn.microsoft.com/en-us/library/ms131077.aspx

我认为表值函数更适合您的情况。

于 2015-05-10T07:18:50.537 回答