NHibernate:如何在 "ROWID"(SQLite 特殊列)上添加条件

NHibernate : How to add a criteria on "ROWID" (SQLite special column)

我对使用 NHibernate Criteria 创建的 SQLite table 有一个看法。现在我想获取视图中某一特定行的位置,我恰好知道其中的 Id。

因为我使用 GUID 作为主键,所以我引用了 ROWID 列,每个 SQLite table 都有。

SQL 应该看起来像这样(在 SQLite 中测试并工作正常):

SELECT COUNT(*) FROM Supplier
WHERE ROWID < (SELECT ROWID FROM Supplier WHERE Id = 'e3a279f6-6761-44a8-b037-f4ea82e9595f') 
AND [view restrictions]

现在我想使用 Criteria 创建一个 NHibernate 查询来执行相同的操作:

Guid id = Guid.Parse("e3a279f6-6761-44a8-b037-f4ea82e9595f")
var rowidSubQuery = DetachedCriteria.For<Supplier>()
    [.. flexible view criteria here ..]
    .Add(Restrictions.Eq("Id", id))
    .SetProjection(Projections.SqlProjection(
        "ROWID as row", new[] { "row" }, new IType[] { NHibernateUtil.String }));

int pos = session.CreateCriteria(typeof(Supplier))
    .Add(Restrictions.Lt("ROWID", rowid))
    .SetProjection(Projections.RowCount())
    .UniqueResult<int>();

但它因 QueryException "could not resolve property: ROWID of: Supplier" 而失败。我知道我没有 属性 Supplier.ROWID,但 ROWID 是 SQLite 中的有效列。我怎样才能继续访问它?

DetachedCriteria 本身有效。问题似乎在行

.Add(Restrictions.Lt("ROWID", rowid))

感谢 Radim,它确实有效!我在我的 class 中添加了一个新的 属性 并为它添加了一个映射。没想到,但它映射得很好,我可以在查询中使用它。我看到的唯一缺点是我必须为每个项目额外加载 4 个字节。

public class Supplier 
{
    ...
    public virtual int RowId { get; protected set; }
}

public class SupplierMap : ClassMap<Supplier>
{
    ...
    Map(x => x.RowId).ReadOnly();
}