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.
Możesz deserializować ciebie, Jonsa, responenta do klasy poco, a następnie użyć go –
Użyłem podejścia zaproponowanego przez RAZERA. Utwórz POCO i użyj Json.NET do serializacji i deserializacji. – jake