用于In子句的ServiceStack Ormlite反序列化数组
我通过ToJson()
在包含所有条件的对象上存储一些查询条件。 一个简单的例子是:
{"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);
}
它产生这样的东西(例如我的测试,是的,我知道店号部分是愚蠢的):
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