2009-09-07 78 views
2

我有一個惱人的問題。這可能是愚蠢的,但我找不到。不能.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的一樣。不像類型轉換

+0

聽起來好像GetAll代碼其實很重要。你可以發佈嗎? – 2009-09-07 14:22:25

+0

它現在在那裏。我認爲NHibernate的Linq將「(x as ILogicalDeletable).IsDeleted == false」轉換爲「NOT(1 = 1)」。 – 2009-09-07 14:30:13

+0

你有沒有找到解決這個問題?我遇到了同樣的事情,不能在我的情況下使用過濾器。 – 2010-04-05 16:07:23

回答

1

看起來你已經有了一個軟刪除模型,你試圖從GetAll()方法中返回這些數據,我同意你的分析:NHibernate .Linq沒有正確處理類型轉換,但您可能想嘗試用query filter替換它。

0
public virtual IQueryable<TEntity> GetAll() 
{ 
    if (typeof(ILogicalDeletable).IsAssignableFrom(typeof(TEntity))) 
    { 
    return session.Linq<TEntity>().OfType<ILogicalDeletable>() 
     .Where(x => !x.IsDeleted).Cast<TEntity>(); 
    } 

    return session.Linq<TEntity>(); 
} 

試試看。

相關問題