servicestack - 转换失败,在 ServiceStack 中使用 AutoQuery 时
问题描述
我有以下自动查询功能。
[Route("/cars/search")]
public class SearchCars : QueryDb<Car, CarDto>
{
public List<int> EquipmentIds { get; set; }
public List<int> ManufacturerIds { get; set; }
public List<int> ColourIds { get; set; }
}
当我执行以下操作时,该功能有效:
汽车/搜索?ColourIds=1&format=json
汽车/搜索?ManufacturerIds=1&format=json
但是当我尝试使用
汽车/搜索?EquipmentIds=1&format=json
我收到“将 varchar 值 '[1]' 转换为数据类型 int 时转换失败。”。
这些字段的区别在于 Car 对象可以有多个 EquipmentId,但 ColourId 和 ManufacturerId 只能有一个。
public class Car
{
[AutoIncrement]
public int Id { get; set; }
public Colour Colour { get; set; }
[Required]
public int ColourId { get; set; }
public Manufacturer Manufacturer { get; set; }
[Required]
public int ManufacturerId { get; set; }
[Required]
public List<Equipment> Equipment { get; set; }
[Required]
public List<int> EquipmentId { get; set; }
}
我是否还必须定义应该为哪个属性分配不同的参数?
解决方案
AutoQuery通过基于隐式约定构建 RDBMS 查询来工作,该隐式约定用于构建在 RDBMS 上运行的 SQL 查询。
OrmLite 数据模型中的复杂类型默认为 blobbed,这意味着它们无法在 RDBMS 中使用 SQL 进行查询,因此您将无法使用 AutoQuery 对其进行查询。
您可以创建一个混合自定义自动查询实现,您可以在其中应用任何自定义逻辑来过滤自动查询结果的结果,例如......
public class MyQueryServices : Service
{
public IAutoQueryDb AutoQuery { get; set; }
//Override with custom implementation
public object Any(SearchCars query)
{
var equipmentIds = query.EquipmentIds;
query.EquipmentIds = null;
var q = AutoQuery.CreateQuery(query, base.Request);
var response = AutoQuery.Execute(query, q);
if (equipmentIds != null)
response.Results.RemoveAll(x => x.EquipmentId...);
return response.
}
}
推荐阅读
- javascript - TypeError 试图上传到 mongoDB
- javascript - odoo 11 中的小部件创建错误(js 升级到 odoo 11 的问题)
- amazon-web-services - 无法跨区域更新安全组规则
- mysql - 列表(从 mysql 数据库获取)到数据帧的转换需要很多时间
- cmake - 链接命令文件更改后让cmake重新链接
- python - 乘法时 Numpy.dot 嵌套向量
- javascript - 将一个文件导入节点js中的另一个文件
- react-native - React Native Flatlist 渲染项
- ssl - https中的cors设置
- api - Instagram API 从参与的人那里获取用户信息