2013-04-09 67 views
1

有沒有什麼方法比較linq查詢中的泛型類型以便用NHibernate轉換爲SQL?NHibernate中的通用參數Linq查詢

事情是這樣的:

public abstract class DataProviderBase<TDAO, TId> 
{ 
    protected ISession Session; 

    public virtual TDAO GetById(TId id) 
    { 
     var allItems = GetAllQuery(); // gives me query, usually Session.Query<TDAO>(); 
     var res = allItems.SingleOrDefault(item => item.Id == id); 
      // !!! Operator '==' cannot be applied to operands of type 'TId' and 'TId' 
     return res; 
    } 

    protected virtual IQueryable<TDAO> GetAllQuery() 
    { 
     var query = Session.Query<TDAO>(); 
     return query; 
    } 
} 

我知道我可以使用Session.Get<TDAO>(id);,但是這不是我要的。 GetAllQuery()是一種虛擬方法,我希望能夠覆蓋它。

  • NHibernate的版本:3.3.3.4000
  • NHibernate.Linq版本:1.0

感謝

+0

您是否試過'item.Id.Equals(id)'? – mickfold 2013-04-09 16:00:23

+0

是的我有,它拋出:'System.NotSupportedException:布爾等於(System.Object)' – 2013-04-09 16:36:40

+1

@MartinVolek這可能是問題的一部分或沒有,但NHibernate.Linq是用於NH 2.1.2; NH 3+擁有一個集成的Linq提供商。確保你沒有使用舊的軟件包。 – 2013-04-09 18:15:06

回答

1

可以dinamically創建斷言。例如:

var parameter = Expression.Parameter(typeof (TDAO)); 
var predicate = Expression.Lambda<Func<TDAO, bool>>(
    Expression.Equal(Expression.Property(parameter, "Id"), 
        Expression.Constant(id)), 
    parameter); 
var res = allItems.SingleOrDefault(predicate); 
+0

不錯的主意,謝謝 – 2013-04-11 21:21:45