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