使用AutoQuery过滤掉软删除

时间:2017-09-21 18:43:03

标签: servicestack ormlite-servicestack autoquery-servicestack

我正在使用ServiceStack和OrmLite,并且迄今为止取得了巨大的成功。我正在寻找一种在使用AutoQuery时过滤掉“软删除”记录的方法。我见过this suggestion使用SqlExpression,但我不知道你会把它放在哪里。应用程序启动时在AppHost中?我做到了,但删除的记录仍然返回。在这种情况下,我的QueryDb请求对象如下:

#bgimg img { width: 100%; }

我使用过的其他SqlExpressions都在存储库类本身,但是我正在使用QueryDb而只使用消息本身(不利用我的存储库类)我没有任何其他代码来处理这些消息并过滤掉“已删除”的内容。

我也尝试使用this approach建议的自定义服务基础,使用以下内容:

public class QueryableStore : QueryDb<StoreDto>
{
} 

调用此代码,但是当Execute调用发生时,我收到错误:

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);
    }
} 

F_is​​deleted列是SQL Server中的“位”,在我的POCO中表示为bool。

关于什么在这里工作的任何想法?我有点不知所措,这似乎很难做到,但文档让它看起来很简单。

1 个答案:

答案 0 :(得分:0)

{0}是db参数的占位符,因此您的SQL应该只使用DB参数的占位符,例如:

var q = AutoQuery.CreateQuery(dto, Request);
q.And(IsDeleted + " = {0}", false);

否则,如果要使用特定于SQL Server的语法,可以使用:

q.And(IsDeleted + " = 0");