Фильтрация программных удалений с помощью AutoQuery
Я использую ServiceStack с OrmLite и до сих пор добиваюсь большого успеха. Я ищу способ отфильтровать "мягко удаленные" записи при использовании AutoQuery. Я видел это предложение использовать SqlExpression, но я не уверен, где вы это разместите. В AppHost, когда приложение запускается? Я сделал это, но удаленные записи все еще возвращаются. Мой объект запроса QueryDb в этом случае выглядит следующим образом:
public class QueryableStore : QueryDb<StoreDto>
{
}
Другие SqlExpressions, которые я использовал, находятся в самом классе репозитория, но поскольку я использую QueryDb и только само сообщение (не используя мой класс репозитория), у меня нет другого кода для обработки этих сообщений и фильтрации "удаленные".
Я также попытался использовать базу пользовательских сервисов, как предлагает этот подход, используя следующее:
public abstract class MyCustomServiceBase : AutoQueryServiceBase
{
private const string IsDeleted = "F_isdeleted";
public override object Exec<From>(IQueryDb<From> dto)
{
var q = AutoQuery.CreateQuery(dto, Request);
q.And("{0} = {1}", IsDeleted, 0);
return AutoQuery.Execute(dto, q);
}
public override object Exec<From, Into>(IQueryDb<From, Into> dto)
{
var q = AutoQuery.CreateQuery(dto, Request);
q.And("{0} = {1}", IsDeleted, 0);
return AutoQuery.Execute(dto, q);
}
}
Этот код вызывается, но когда происходит вызов Execute, я получаю сообщение об ошибке:
System.ArgumentException: 'Conversion failed when converting the varchar value 'F_isdeleted' to data type int.'
Столбец F_isdeleted является "битом" в SQL Server и представлен как bool в моем POCO.
Любые идеи о том, что будет работать здесь? Я вроде в недоумении, что это кажется трудным для выполнения, но документы позволяют сделать это довольно простым.
1 ответ
{0}
являются заполнителями для параметров БД, поэтому ваш SQL должен использовать только заполнители для параметров БД, например:
var q = AutoQuery.CreateQuery(dto, Request);
q.And(IsDeleted + " = {0}", false);
В противном случае, если вы хотите использовать специфичный для SQL Server синтаксис, вы можете использовать:
q.And(IsDeleted + " = 0");