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

时间:2015-04-06 14:42:11

标签: sqlite nhibernate

我有一个使用NHibernate Criteria创建的SQLite表的视图。现在我想在视图中获取一个特定行的位置,我碰巧知道Id。

由于我使用GUID作为主键,因此我引用ROWID列,每个SQLite表都有。

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&#34;无法解析属性:ROWID:Supplier&#34;。我知道我没有属性Supplier.ROWID,但ROWID是SQLite中的有效列。我怎么还能访问它?

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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