首页 > 解决方案 > 转换失败,在 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; }

}

我是否还必须定义应该为哪个属性分配不同的参数?

标签: servicestack

解决方案


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.
    }
}

推荐阅读