2017-06-08 3 views
0

Ich speichere einige Abfragekriterien in der db über eine ToJson() auf das Objekt, das alle Kriterien enthält. Ein vereinfachtes Beispiel wäre:ServiceStack Ormlite Deserialize Array für In

{"FirstName" :[ {Operator: "=", Value: "John"}, { Operator: "in", Value:" ["Smith", "Jones"]"}], "SomeId": [Operator: "in", Value: "[1,2,3]" }]} 

Die Listen sind entweder String, Int, Dezimal oder Datum. Diese werden alle der gleichen Klasse/Tabelle zugeordnet, so dass es einfach ist, über Reflektion den Typ FirstName oder SomeId zu erhalten.

Ich versuche, eine zu schaffen, in der Klausel auf der Grundlage dieser Informationen:

if (critKey.Operator == "in") 
{ 
    wb.Values.Add(keySave + i, (object)ConvertList<Members>(key, 
    (string)critKey.Value)); 
    wb.WhereClause = wb.WhereClause + " And {0} {1} (@{2})".Fmt(critKey.Column, 
    critKey.Operator, keySave + i); 
} 
else 
{ 
    wb.Values.Add(keySave + i, (object)critKey.Value); 
    wb.WhereClause = wb.WhereClause + " And {0} {1} @{2}".Fmt(critKey.Column, critKey.Operator, keySave + i); 
} 

es so etwas wie diese erzeugt (Beispiel aus meinen Tests, ja ich weiß das storenumber Teil ist dumm):

Email = @Email0 And StoreNumber = @StoreNumber0 And StoreNumber in (@StoreNumber1) 

Ich renne in ein Problem mit den Listen. Gibt es eine schöne Möglichkeit, dies mit einem der ormlite-Tools zu tun, anstatt alles manuell zu machen? Die WHERE-Klausel generiert eine Strafe, außer wenn es sich um Listen handelt. Ich versuche, es generisch zu machen, aber ich habe eine harte Zeit in diesem Teil.

Zweite Frage vielleicht verwandt, aber ich kann nicht finden, wie Parameter mit in zu verwenden scheinen. Kommend von NPOco können Sie (colum in @0, somearray) tun, aber ich kann nicht herausfinden, wie man das macht, ohne Sql.In zu benutzen.

Antwort

0

ich mit am Ende verwenden, um meine eigenen Parser zu schreiben, wie es scheint ormlite nicht die gleiche Unterstützung für Abfrage params für Listen wie NPoco unterstützt haben. Grundsätzlich würde ich es vorziehen, die Lage sein, dies zu tun:

Where("SomeId in @Ids") und in einem Parameter übergeben, aber mit diesem Code endete:

listObject = ConvertListObject<Members>(key, (string)critKey.Value); 
wb.WhereClause = wb.WhereClause + " And {0} {1} ({2})" 
    .Fmt(critKey.Column, critKey.Operator,listObject.EscapedList(ColumnType<Members>(key))); 

public static string EscapedList(this List<object> val, Type t) 
{ 
    var escapedList = ""; 
    if (t == typeof(int) || t == typeof(float) || t == typeof(decimal)) 
    { 
     escapedList = String.Join(",", val.Select(x=>x.ToString())); 
    } else 
    { 
     escapedList = String.Join(",", val.Select(x=>"'" + x.ToString() + "'")); 
    } 
    return escapedList; 

    } 

Ich mag würde andere Antworten sehen, vor allem, wenn ich fehle etwas in ormlite.

0

Wenn mit Listen zu tun können Sie das folgende Beispiel

var storeNumbers = new [] { "store1", "store2", "store3" }; 
var ev = Db.From<MyClass> 
    .Where(p => list.Contains(p => p.StoreNumber)); 
var result = Db.Select(ev); 
+0

Ich kann die getippte API in meinem Fall nicht verwenden – lucuma

Verwandte Themen