ServiceStack Ormlite 为 In 子句反序列化数组

ServiceStack Ormlite Deserialize Array for In Clause

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

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

列表可以是字符串、整数、小数或日期。这些都映射到相同的 class/table,因此很容易通过反射获得 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);
}

它生成这样的东西(来自我的测试的例子,是的,我知道 storenumber 部分很愚蠢):

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

我 运行 遇到了列表问题。有没有一种很好的方法可以使用任何 ormlite 工具来完成这项工作,而不是全部手动完成?除了处理列表时,where 子句生成良好。我正在尝试使其通用化,但在这方面遇到了困难。

第二个问题可能相关,但我似乎无法找到如何使用 in 的参数。来自 NPoco,你可以做 (colum in @0, somearray)` 但我似乎无法在不使用 Sql.In.

的情况下找到如何做到这一点

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

var storeNumbers = new [] { "store1", "store2", "store3" };
var ev = Db.From<MyClass>
    .Where(p => storeNumbers.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 中遗漏某些内容时。