.net NHibernate Linq查询中的泛型参数

.net NHibernate Linq查询中的泛型参数,.net,linq,nhibernate,generics,linq-to-nhibernate,.net,Linq,Nhibernate,Generics,Linq To Nhibernate,有没有办法比较linq查询中的泛型类型,以便将其转换为带有NHibernate的SQL 大概是这样的: 公共抽象类DataProviderBase { 受保护的会话; 公共虚拟TDAO GetById(TId id) { var allItems=GetAllQuery();//提供查询,通常是Session.query(); var res=allItems.SingleOrDefault(item=>item.Id==Id); //!!!运算符“==”不能应用于“TId”和“TId”类型的操

有没有办法比较linq查询中的泛型类型,以便将其转换为带有NHibernate的SQL

大概是这样的:

公共抽象类DataProviderBase
{
受保护的会话;
公共虚拟TDAO GetById(TId id)
{
var allItems=GetAllQuery();//提供查询,通常是Session.query();
var res=allItems.SingleOrDefault(item=>item.Id==Id);
//!!!运算符“==”不能应用于“TId”和“TId”类型的操作数
返回res;
}
受保护的虚拟IQueryable GetAllQuery()
{
var query=Session.query();
返回查询;
}
}
我知道我可以使用Session.Get(id),但这不是我想要的
GetAllQuery()
是一个虚拟方法,我希望能够覆盖它

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

谢谢

您可以通过友好方式创建谓词。例如:

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);
var参数=表达式参数(typeof(TDAO));
var谓词=表达式.Lambda(
Expression.Equal(Expression.Property(参数,“Id”),
表达式.常量(id)),
参数);
var res=allItems.SingleOrDefault(谓词);

您可以通过友好方式创建谓词。例如:

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);
var参数=表达式参数(typeof(TDAO));
var谓词=表达式.Lambda(
Expression.Equal(Expression.Property(参数,“Id”),
表达式.常量(id)),
参数);
var res=allItems.SingleOrDefault(谓词);

您是否尝试过
item.Id.Equals(Id)
?是的,我尝试过,它抛出:
System.NotSupportedException:Boolean Equals(System.Object)
@MartinVolek这可能是问题的一部分,但NHibernate.Linq将与NH2.1.2一起使用;NH 3+有一个集成的Linq提供商。确保您没有使用旧软件包。@Diego Mijelshon我不知道。我已经删除了Nhibernate.Linq程序集,但它没有像我预期的那样起到作用。我以前没用过。但是很高兴知道,谢谢。你试过
item.Id.Equals(Id)
?是的,我试过了,它抛出:
System.NotSupportedException:Boolean Equals(System.Object)
@MartinVolek这可能是问题的一部分,但NHibernate.Linq将与nh2.1.2一起使用;NH 3+有一个集成的Linq提供商。确保您没有使用旧软件包。@Diego Mijelshon我不知道。我已经删除了Nhibernate.Linq程序集,但它没有像我预期的那样起到作用。我以前没用过。但很高兴知道,谢谢。