2016-06-26 6 views
0

Ich habe grundsätzlich eine generische Klasse namens DynamicServices. Die dynamicServices wird wie folgt aussehensql von Ausdrucksbäumen C#

class DynamicEntityServices<T>{ 
    T GetById(Guid Id) { // get from db using ado.net dal 
    List<T> Search(SearchCondition searchCondition) { // filtering the data from the dal 
} 

nun, dass ich eine json Spec-Datei haben [im Grunde eine json Schemadatei, die die dynamische Einheit und seine Eigenschaft/types definiert

Während der Laufzeit ich die Verbraucher wollen von meinem Dienst zu bauen und mir eine Suchbedingung zu senden.

ich meine SQLDAL Umsetzung wie folgt

class DynamicEntityDAL<T>{ 
    List<T> Search(SearchCondition condition){ 
     StringBuilder query = new StringBuilder(); 
     foreach(var field in condition.Fields){ 
     query.Append(" "+field.Key+" like '%"+field.Value+"%' ") 

und etwas ähnlich dem oben haben zur Zeit weiß ich, dass das obige Verfahren ist richtig, weil es praktische Grenzen dafür. Bitte beachten Sie, dass Ich mag würde, um tatsächlich einen Ausdruck in von dem Anrufer meines dynamischen Dienstes in der Suchbedingung geschickt bekommen und dann werde ich die Abfrage als wie unten

var filterExpr = new Expression()... 
var paramterExpr = new ParameterExpression("categorystatus",true); // not the right ones, but will look similar to this. 
var condition = new SearchCondition{ SearchExpression = filterExpr }; 

In DAL, I can try to convert the above to SQL using some expression visitor like 
`string filterClause = ConvertToSql(condition.SearchExpression);` 

Ich lese konstruieren kann und Dinge umzusetzen, aber als Meine JSON-Schemadateien sind dynamisch, ich kann EF nicht verwenden. Bitte schlagen Sie den richtigen Ansatz vor, damit meine Bibliothek den Ausdruck vom Aufrufer des Dienstes abrufen und ihn auch in T-SQL übersetzen und von db abfragen kann.

+1

Wenn Sie nur besorgt sind, wie man SQL aus dem Standard Expression Tress erzeugt, dann würde [diese Antwort] (http://stackoverflow.com/a/7933938/3745022) für Sie von Nutzen sein. Wenn Sie wissen möchten, wie Sie diesen Ausdrucksbaum aus Ihrem nicht spezifizierten JSON erstellen, sollten Sie weitere Einzelheiten angeben. Für einfache Abfragen können Sie Ausdrucksbäume manuell erstellen. Wenn Ihr JSON jedoch etwas Komplexeres darstellt, wäre dies eine nichttriviale Aufgabe. –

Antwort

1

Angenommen, Sie haben ein Stück von JSON, die den Ausdruck für eine WHERE Klausel einer Benutzerabfrage darstellt, werden dann hier die Schritte, die auf SQL Umwandlung:

  1. Convert JSON-String in einen Hierarchische Objekt.
  2. Konvertieren Sie das hierarchische Objekt in SQL.

Angenommen, Sie haben bereits (1) gemacht (es sieht aus wie Sie Expression ‚s erstellen können, vermutlich aus dem JSON), dann brauchen Sie nur etwas zu schreiben, das Hierarchische Objekt rekursiv durchläuft und wandelt es in SQL, abhängig von der Art von Expression.

Sie werden wahrscheinlich irgendwo eine Vorstellung von einem expliziten Schema (Tabellen und Spalten) benötigen, um Ihre JOINs dynamisch zu berechnen, es sei denn, dies ist alles in einer Tabelle/Ansicht. Wenn die Fremdschlüsselbeziehungen eines Schemas ein zyklisches Diagramm erstellen, müssen Sie zusätzlich zu den Tabellen und Spalten Beziehungen definieren (anhand derer Sie festlegen können, welcher Join-Typ verwendet werden soll, sofern Sie nicht annehmen können, dass INNER immer in Ordnung ist). Dies hilft Ihnen auch, wenn Sie die Spalten SELECT und ORDER BY ändern möchten, wenn dies erforderlich ist.

Dies wird von jemandem kommt, die ähnlichen Dinge mehrfach in der Vergangenheit geschrieben hat:

  • richtig zu tun Dies ist sehr zeitaufwendig und nicht-triviale; Es ist besser, etwas zu finden, das bereits etwas Ähnliches tut, was man möchte, anstatt es von Grund auf neu zu schreiben.
  • Nutzen Sie so viele existierende Frameworks wie möglich, wenn es nicht schon etwas gibt, das für Sie funktioniert. Zum Beispiel, Linq Expression s wiederverwenden statt rollen Sie Ihre eigenen, die es aussieht, wie Sie das getan haben.

Viel Glück!