2013-07-03 8 views
9

Poszukuję każdego, kto zrobił coś na wzór zapytania łańcuchów JSON za pomocą Entity Framework.Framework Entity Framework służący do wysyłania zapytań do ciągów JSON w SQL Server

Powinienem podać trochę informacji o tym, co próbuję tutaj zrobić. Baza danych, której używam, dotyczy silnika workflow, nad którym pracuję. Obsługuje wszystkie dane przepływu pracy, a także pozwala przechowywać pewne niestandardowe dane jako ciąg znaków JSON. Mechanizm workflow, którego używam obsługuje serializowanie i deklasyfikację ciągów JSON na żądanie, ale w przypadku, gdy chciałbym wykonać zapytanie i filtrować na podstawie wartości w ciągu JSON, musiałbym ciągnąć całą tabelę do pamięci i rozdzielić wszystkie wpisy, a następnie filtrować. Jest to, z oczywistych względów, nie do zaakceptowania. Powodem jest to, że potrzebujemy jednej bazy danych przepływu pracy, która może być używana we wszystkich aplikacjach, które używają tego silnika przepływu pracy, i staramy się unikać konieczności wykonywania widoków w różnych bazach danych w celu oddzielenia określonych baz danych aplikacji w celu uzyskania niestandardowych danych. Ponieważ w większości przypadków dane żądania niestandardowego, które są przechowywane jako ciągi JSON, są względnie proste, a w większości przypadków nie są potrzebne podczas wysyłania zapytań, co jest zgodne z projektem. Jeśli jednak zajdzie potrzeba wykonania niestandardowych wyszukiwań, potrzebujemy sposobu na przeanalizowanie tych niestandardowych obiektów JSON. Mam nadzieję, że można to zrobić dynamicznie z Entity, więc nie muszę pisać dodatkowych przechowywanych proców do odpytywania o określone typy obiektów. Idealnie byłoby po prostu mieć jedną bibliotekę, która używa podmiotu, aby umożliwić kwerendy dowolnej struktury danych JSON.

Zacząłem od funkcji bazy danych, którą znalazłem, która parsuje JSON i zwraca spłaszczoną tabelę zawierającą wartości (identyfikator obiektu nadrzędnego, nazwę, wartość i typ). Następnie zaimportowałem tę funkcję do mojego modelu encji. Oto link do miejsca, z którego otrzymałem kod. Bardzo interesujący artykuł.

Consuming JSON Strings in SQL Server

Oto podstawy gdzie jestem.

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

W powyższym przykładzie kodu obiekt Żądaj jest moim podstawowym obiektem żądania przepływu pracy. RequestData() jest metodą rozszerzenia na typ

DbSet<Request> 

i parseJSON to nazwa mojej funkcji bazy danych.

Mój plan jest napisać serię metod rozszerzenie, które filtruje Queryables

IQueryable<parseJSON_result> 

Tak na przykład, jeśli mam obiekt, który wygląda tak.

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

byłbym w stanie zrobić coś takiego

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

lub coś wzdłuż tych linii. Metoda .Where będzie Take RequestData(), która jest produktem IQueryable zawierającym przeanalizowany JSON, będzie filtrować i zwracać nowy wynik IQueryable.

Moje pytanie brzmi, czy ktoś zrobił coś takiego? Jeśli tak, jakie podejście podjąłeś? Moim początkowym zamiarem było zrobienie czegoś w stylu słownika, ale wydawało się to zbyt trudne. Wszelkie przemyślenia, pomysły, sugestie, mądrość będą mile widziane. Pracowałem nad tym przez jakiś czas i czuję, że naprawdę nie zaszedłem tak daleko. Co jest głównie dlatego, że nie mogę zdecydować, jak chcę wyglądać składni, i nie jestem pewien, czy powinienem robić więcej bazy danych pracy.

To był mój oryginalny pomysł na składnię, ale nie mogłem uruchomić operatora [] bez nawilżania obiektu.

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

Wiem, że to dość długi post, więc jeśli przeczytałeś tak daleko, dziękuję za poświęcenie czasu na przeczytanie całej sprawy.

+0

Możesz deserializować ciebie, Jonsa, responenta do klasy poco, a następnie użyć go –

+0

Użyłem podejścia zaproponowanego przez RAZERA. Utwórz POCO i użyj Json.NET do serializacji i deserializacji. – jake

Odpowiedz

0

Co można zrobić, to utworzyć funkcję SQL Server zdefiniowaną przez użytkownika SQL Server, a następnie użyć jej z zapytania.

widzisz tego linku https://msdn.microsoft.com/en-us/library/ms131077.aspx

chciałbym myśleć, że funkcje wycenione tabela jest bardziej odpowiedni dla danej sytuacji.

1

Istnieje SQL Server 2016, FOR JSON i OPENJSON istnieją, równoważne FOR XML i OPENXML. Można indeksować wyrażenia odwołujące się do JSON przechowywanego w kolumnach NVARCHAR.

+0

Czy Entity Framework to obsługuje? – Zapnologica

0

To bardzo późno odpowiedź, ale dla każdego, kto jest wciąż szukają ...

Jak mówi @Emyr, SQL 2016 obsługuje zapytań wewnątrz kolumn JSON wykorzystujących oświadczenia JSON_VALUE lub OPENJSON.

Entity Framework nadal nie obsługuje tego bezpośrednio, ale można użyć metody SqlQuery do uruchomienia surowego polecenia SQL bezpośrednio względem bazy danych, które może wykonywać kwerendy wewnątrz kolumn JSON i zapisuje zapytania i deserializację każdego wiersza w celu uruchomienia prostego zapytania .