繁体   English   中英

用于在SQL Server中查询JSON字符串的实体框架

[英]Entity Framework for querying JSON strings in SQL Server

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

我应该给出一些关于我在这里要做什么的背景知识。 我正在使用的数据库是我正在处理的工作流引擎。 它处理所有工作流数据,还允许您将一些自定义数据存储为JSON字符串。 我正在使用的工作流引擎在每个请求的基础上处理JSON字符串的序列化和反序列化,但是如果我想要根据JSON字符串中的值进行查询和过滤,我将不得不拉整个表进入内存并反序列化所有条目然后过滤。 出于显而易见的原因,这是不可接受的。 这样做的原因是,我们想要一个可用于所有使用此工作流引擎的应用程序的工作流数据库,并且我们正在尝试避免必须跨数据库视图来分离特定于应用程序的数据库以获取自定义数据。 因为在大多数情况下,作为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方法将Take 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的表达式。

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

正如@Emyr所说,SQL 2016支持使用JSON_VALUE或OPENJSON语句查询JSON列内部。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM