用于In子句的ServiceStack Ormlite反序列化数组

我通过ToJson()在包含所有条件的对象上存储一些查询条件。 一个简单的例子是:

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

列表是字符串,整数,小数或日期。 这些都映射到相同的类/表,因此通过反射很容易获得FirstNameSomeId的类型。

我试图根据这些信息创建一个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);
}

它产生这样的东西(例如我的测试,是的,我知道店号部分是愚蠢的):

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

我遇到了列表中的问题。 有没有一种很好的方法可以使用任何的ormlite工具来做到这一点,而不是手动完成这一切? 除了处理列表时,where子句会生成很好的结果。 我试图把它变成通用的,但在这方面却很难。

第二个问题也许是相关的,但我似乎无法找到如何使用in参数。 来自NPoco你可以做(colum in @0 ,somearray colum)``但我不能'看起来不知道如何做到这一点,而不使用Sql.In.


处理列表时,可以使用下面的示例

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

我最终不得不编写我自己的解析器,因为看起来ormlite不支持对像NPoco这样的列表的查询参数具有相同的支持。 基本上我宁愿能够做到这一点:

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中丢失了某些东西。

链接地址: http://www.djcxy.com/p/65979.html

上一篇: ServiceStack Ormlite Deserialize Array for In Clause

下一篇: [Reference] or [Ignore]?