Ошибка преобразования при использовании AutoQuery в ServiceStack - PullRequest
1 голос
/ 09 апреля 2019

У меня есть следующая функция 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 & = формат JSON

Автомобили / Поиск? ManufacturerIds = 1 & = формат JSON

но когда я пытаюсь использовать

Автомобили / Поиск? EquipmentIds = 1 & = формат JSON

Я получаю "Преобразование не удалось при преобразовании значения varchar '[1]' в тип данных int.".

Разница между этими полями заключается в том, что у объекта Car может быть несколько EquipmentIds, но только один 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 Ответ

1 голос
/ 09 апреля 2019

AutoQuery работает путем построения запроса RDBMS на основе неявных соглашений , который используется для создания запроса SQL, который выполняется в RDBMS.

Сложные типы в моделях данных OrmLite по умолчанию добавляются в BLOB-объекты, что означает, что они не могут быть запрошены в СУБД с помощью SQL, поэтому вы не сможете запросить их с помощью AutoQuery.

Вы можете создать гибридную Пользовательскую реализацию AutoQuery , где вы можете применить любую пользовательскую логику для фильтрации результатов результатов 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.
    }
}
...