2017-06-08 8 views
0

すべての条件を含むオブジェクトのToJson()を介してdbにクエリ条件を格納しています。簡略化した例は次のようになります。ServiceStack Ormlite In Clauseの配列を逆シリアル化する

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

リストは、文字列、整数、小数または日付のいずれかです。これらはすべて同じクラス/テーブルにマップされるので、リフレクションによって容易にFirstNameまたはSomeIdのタイプを得ることができます。

私は、この情報に基づいて、where句を作成しようとしています:

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); 
} 

それはこのような何かを生成(私のテストの例を、はい、私はstorenumber部分は愚かなことを知っている):

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

私はリストに問題があります。これを手作業で行うのではなく、オルタイトツールでこれを行う良い方法はありますか? where節は、リストを扱うときを除いて、罰金を出します。私はそれを一般的なものにしようとしていますが、その部分には苦労しています。

2番目の質問が関連している可能性がありますが、inでパラメータを使用する方法がわかりません。 NPocoから来て(colum in @0、somearrayを実行できます) `しかし、私はできません 'はSql.Inを使用せずにこれを行う方法を見つけるようです。リストを扱う場合

答えて

0

次の例を使用することができ、私はormliteがNPocoのようなリストのクエリのparamsのために同じサポートを持ってサポートしていないようだと、私自身のパーサーを書くためになってしまいました。基本的に私はこれを行うことができるように好む:

Where("SomeId in @Ids")を、パラメータを渡しますが、このコードになってしまった:

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; 

    } 

私が欠けている場合は特に他の回答を見てみたいと思いますormliteのもの

0

あなたは

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

私の場合は型付きAPIを使用できません – lucuma

関連する問題