簡體   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