Фильтрация программных удалений с помощью 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");
Другие вопросы по тегам