在ServiceStack中使用自动查询时,转换失败

时间:2019-04-09 20:27:10

标签: servicestack

我具有以下自动查询功能。

[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; }

}

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

1 个答案:

答案 0 :(得分:1)

AutoQuery通过基于implicit conventions构造RDBMS查询来工作,该查询用于构造在RDBMS上运行的SQL查询。

OrmLite数据模型中的复杂类型默认为blob,这意味着无法在带有SQL的RDBMS中查询它们,因此您将无法使用自动查询来查询它。

您可以创建一个混合Custom AutoQuery Implementation,您可以在其中应用任何自定义逻辑来过滤自动查询结果的结果,例如...

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