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,因此很容易通过反射获得 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)
我 运行 遇到了列表问题。有没有一种很好的方法可以使用任何 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 中遗漏某些内容时。
我通过 ToJson()
在包含所有条件的对象上将一些查询条件存储在数据库中。一个简化的例子是:
{"FirstName" :[ {Operator: "=", Value: "John"}, { Operator: "in", Value:" ["Smith", "Jones"]"}], "SomeId": [Operator: "in", Value: "[1,2,3]" }]}
列表可以是字符串、整数、小数或日期。这些都映射到相同的 class/table,因此很容易通过反射获得 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)
我 运行 遇到了列表问题。有没有一种很好的方法可以使用任何 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 中遗漏某些内容时。