1

我正在将 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);
    }
} 

这段代码被调用,但是当执行调用发生时,我得到一个错误:

System.ArgumentException:  'Conversion failed when converting the varchar value 'F_isdeleted' to data type int.'

F_isdeleted 列是 SQL Server 中的“位”,在我的 POCO 中表示为布尔值。

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

4

1 回答 1

0

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

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

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

q.And(IsDeleted + " = 0");
于 2017-09-22T00:01:32.913 回答