【问题标题】:ServiceStack Ormlite Deserialize Array for In ClauseServiceStack Ormlite 为 In 子句反序列化数组
【发布时间】:2021-04-22 05:37:13
【问题描述】:

我通过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);
}

它会生成类似这样的东西(我的测试中的示例,是的,我知道 storenumber 部分很愚蠢):

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

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

第二个问题可能相关,但我似乎无法找到如何使用 in 的参数。来自 NPoco,您可以执行 (colum in @0, somearray)`,但我似乎无法在不使用 Sql.In 的情况下找到如何执行此操作。

【问题讨论】:

    标签: service ormlite-servicestack


    【解决方案1】:

    我最终不得不编写自己的解析器,因为似乎 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 中遗漏了一些东西。

    【讨论】:

      【解决方案2】:

      在处理列表时,您可以使用以下示例

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

      【讨论】:

      • 在我的情况下,我无法使用键入的 api
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多