我有一個惱人的問題。這可能是愚蠢的,但我找不到。不能.Count()IQueryable(NHibernate)
我正在使用Linq到NHibernate,我想統計一個存儲庫中有多少項。這裏是我的倉庫的一個非常簡單的定義,與重要的代碼:
public class Repository {
private ISession session;
/* ... */
public virtual IQueryable<Product> GetAll() {
return session.Linq<Product>();
}
}
所有問題的最終相關代碼。
然後,指望我的資料庫中的項目,我做這樣的事情:
var total = productRepository.GetAll().Count();
的問題是,total
爲0始終。但是,存儲庫中有項目。此外,我可以.Get(id)
其中任何一個。
我NHibernate的日誌表明,下面的查詢被執行:
SELECT count(*) as y0_ FROM [Product] this_ WHERE not (1=1)
那一定是「哪裏都不(1 = 1)」條款這一問題的原因。
我能做些什麼才能夠.Count()
我的資料庫中的項目?
謝謝!
編輯:實際上,repository.GetAll()代碼有點不同......並且可能會改變一些東西!它實際上是實體的通用存儲庫。一些實體還實現了ILogicalDeletable接口(它包含一個單一的布爾屬性「IsDeleted」)。就在GetAll()方法中的「返回」之前,我檢查我正在查詢的實體是否實現了ILogicalDeletable。
public interface IRepository<TEntity, TId> where TEntity : Entity<TEntity, TId> {
IQueryable<TEntity> GetAll();
...
}
public abstract class Repository<TEntity, TId> : IRepository<TEntity, TId>
where TEntity : Entity<TEntity, TId>
{
public virtual IQueryable<TEntity> GetAll()
{
if (typeof (ILogicalDeletable).IsAssignableFrom(typeof (TEntity)))
{
return session.Linq<TEntity>()
.Where(x => (x as ILogicalDeletable).IsDeleted == false);
}
else
{
return session.Linq<TEntity>();
}
}
}
public interface ILogicalDeletable {
bool IsDeleted {get; set;}
}
public Product : Entity<Product, int>, ILogicalDeletable
{ ... }
public IProductRepository : IRepository<Product, int> {}
public ProductRepository : Repository<Product, int>, IProductRepository {}
編輯2:實際上.GetAll()
總是返回一個空的結果集爲實現ILogicalDeletable接口實體(即,它總是添加WHERE NOT (1=1)
條款
我認爲LINQ到NHibernate的一樣。不像類型轉換
聽起來好像GetAll代碼其實很重要。你可以發佈嗎? – 2009-09-07 14:22:25
它現在在那裏。我認爲NHibernate的Linq將「(x as ILogicalDeletable).IsDeleted == false」轉換爲「NOT(1 = 1)」。 – 2009-09-07 14:30:13
你有沒有找到解決這個問題?我遇到了同樣的事情,不能在我的情況下使用過濾器。 – 2010-04-05 16:07:23