2013-07-03 3 views
9

Entity Framework를 사용하여 JSON 문자열을 쿼리하는 단계에서 아무 것도하지 않는 사람을 찾고 있습니다.SQL Server에서 JSON 문자열을 쿼리하기위한 Entity Framework

여기서 내가하려고하는 것에 대해 약간의 배경 지식을 제공해야합니다. 내가 사용하고있는 데이터베이스는 내가 작업하고있는 워크 플로우 엔진을위한 것이다. 모든 워크 플로우 데이터를 처리하고 사용자 정의 데이터를 JSON 문자열로 저장할 수 있습니다. 내가 사용하고있는 워크 플로우 엔진은 요청 단위로 JSON 문자열의 직렬화 및 비 직렬화를 처리하지만 JSON 문자열의 값을 기반으로 쿼리 및 필터를 수행하려는 경우에는 전체 테이블을 메모리에 저장하고 모든 항목을 비 직렬화 한 다음 필터링합니다. 분명한 이유는 받아 들일 수없는 것입니다. 이렇게하는 이유는이 워크 플로 엔진을 사용하는 모든 응용 프로그램에 사용할 수있는 단일 워크 플로 데이터베이스가 필요하기 때 문이며 사용자 지정 데이터를 얻기 위해 응용 프로그램 별 데이터베이스를 분리하기 위해 데이터베이스 간보기를 수행하지 않아도됩니다. 대부분의 경우 JSON 문자열로 저장되는 사용자 정의 요청 데이터는 상대적으로 간단하며 대부분의 경우 쿼리 할 때 필요하지 않습니다. 이것은 의도적으로 설계된 것입니다. 하지만 커스텀 검색을 할 필요가있는 경우, 이러한 커스텀 JSON 객체를 파싱 할 수있는 방법이 필요하다. 그리고 나는 이것이 특정 타입의 객체를 질의하기 위해 여분의 저장된 procs를 작성할 필요가 없기 때문에 이것이 Entity로 동적으로 수행되기를 바라고 있습니다. 이상적으로는 모든 JSON 데이터 구조에 대한 쿼리를 허용하는 엔티티를 사용하는 라이브러리가 하나만 있으면됩니다.

JSON을 구문 분석하고 값 (상위 개체 ID, 이름, 값 및 형식)이 포함 된 병합 된 테이블을 반환하는 데이터베이스 함수로 시작했습니다. 그런 다음이 함수를 내 엔티티 모델로 가져 왔습니다. 여기에 코드가있는 곳의 링크가 있습니다. 꽤 흥미로운 기사.

Consuming JSON Strings in SQL Server

는 여기에 내가 어디에 있어요의 기초입니다.

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

위의 코드 예제에서 Request 개체는 기본 워크 플로 요청 개체입니다. RequestData()는

의 확장 메서드입니다.
DbSet<Request> 

이고 parseJSON은 데이터베이스 함수의 이름입니다.

내 계획은 나는이처럼 보이는 물체가있는 경우, 예를 들어, 그래서 Queryables

IQueryable<parseJSON_result> 

를 필터링합니다 확장 메서드의 시리즈를 작성하는 것입니다.

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

나는 그 라인을 따라

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

또는 뭔가처럼 뭔가를 할 수있을 것입니다. .Where 메서드는 구문 분석 된 JSON을 포함하는 IQueryable 인 RequestData()를 받아 들여 새로운 IQueryable 결과를 필터링하고 반환합니다.

내 질문은 정말 그렇습니다. 그렇다면 어떤 접근 방식을 취했습니까? 나의 원래 의도는 사전 스타일을하는 것이었지만 너무 어려워 보였다. 어떤 생각, 아이디어, 제안, 지혜, 많은 감사 할 것입니다. 나는 이것을 잠시 동안 일했고, 나는 정말로 그렇게까지 얻지 못했다고 느낀다. 대부분 구문 분석을 원하는 방식으로 결정할 수 없기 때문에 주로 더 많은 작업 데이터베이스 측을 사용해야하는지 잘 모르겠습니다.

이것은 구문에 대한 원래 생각 이었지만 개체를 ​​수화하지 않고 [] 연산자를 실행할 수 없습니다.

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

난 당신이 지금까지 감사를 읽었습니다, 그래서 만약이 꽤 긴 포스트 알고 단지 전체를 읽을 수있는 시간을내어.

+0

pson 클래스로 json respone을 비 직렬화 한 다음 사용하십시오. –

+0

RAZER가 제안한 접근 방식을 사용했습니다. POCO를 만들고 직렬화와 비 직렬화를 위해 Json.NET을 사용하십시오. – jake

답변

1

SQL Server 2016부터는 FOR XML 및 OPENXML과 동일한 FOR JSON 및 OPENJSON이 존재합니다. NVARCHAR 열에 저장된 JSON을 참조하는 식에서 인덱싱 할 수 있습니다.

+0

Entity Framework가 이것을 지원합니까? – Zapnologica

0

이 매우 늦게 대답이지만, @Emyr가 말한대로 사람을 위해 여전히 SQL 2016 JSON_VALUE 또는 OPENJSON 문을 사용하여 JSON 열 내부 쿼리 지원, ...

를 검색하는 사람.

Entity Framework는 여전히이 기능을 직접 지원하지 않지만 SqlQuery 메서드를 사용하면 JSON 열 내부에서 쿼리 할 수있는 데이터베이스에 대해 원시 SQL 명령을 직접 실행할 수 있으며 간단한 쿼리를 실행하기 위해 모든 행을 쿼리 및 비 직렬화하는 작업을 저장할 수 있습니다 .

관련 문제