2013-04-09 65 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