Ошибка преобразования при использовании автозапроса в ServiceStack

#servicestack

#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=1amp;format= json

Автомобили / Поиск?ManufacturerIds=1amp;format=json

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

Автомобили / Поиск?EquipmentIds=1amp;format=json

Я получаю «Ошибка преобразования при преобразовании значения varchar ‘[1]’ в тип данных int.».

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

2. Я изменил это, потому что объединение не сработало бы, если бы оно было названо EquipmentIds. Я изменил его обратно, но это не помогло.

Ответ №1:

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

Сложные типы в моделях данных ORMLite по умолчанию являются blobbed, что означает, что они не могут быть запрошены в СУБД с помощью 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.
    }
}