我有一个使用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))
答案 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();
}