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();
}
我对使用 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();
}