C# 具有IUserType的NHibernate linq查询
在我的项目中,我使用一个IUserType(BooleanM1),它处理布尔值,并将-1表示真值,0表示假值写入数据库。到目前为止,一切进展顺利。映射看起来像 这: BooleanM1实现如下所示:C# 具有IUserType的NHibernate linq查询,c#,linq,nhibernate,iusertype,C#,Linq,Nhibernate,Iusertype,在我的项目中,我使用一个IUserType(BooleanM1),它处理布尔值,并将-1表示真值,0表示假值写入数据库。到目前为止,一切进展顺利。映射看起来像 这: BooleanM1实现如下所示: { public class BooleanM1 : IUserType { public bool IsMutable { get { return false; } } public Type ReturnedType
{
public class BooleanM1 : IUserType
{
public bool IsMutable
{
get { return false; }
}
public Type ReturnedType
{
get { return typeof(bool); }
}
public SqlType[] SqlTypes
{
get { return new[]{NHibernateUtil.Int16.SqlType}; }
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]);
if(obj == null ) return false;
return ((string)obj == "-1" || (string)obj == "1") ? true : false;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if(value == null)
{
((IDataParameter) cmd.Parameters[index]).Value = DBNull.Value;
}
else
{
((IDataParameter) cmd.Parameters[index]).Value = (bool)value ? -1 : 0;
}
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
public new bool Equals(object x, object y)
{
if( ReferenceEquals(x,y) ) return true;
if( x == null || y == null ) return false;
return x.Equals(y);
}
public int GetHashCode(object x)
{
return x == null ? typeof(bool).GetHashCode() + 473 : x.GetHashCode();
}
}
这是linq提供程序中的已知错误还是我的用户类型有问题?非常感谢您的帮助。您已经解决了这个问题吗 不确定是否是同一个问题,但我遇到了类似的问题,其中数据库字段可为空,自定义类型指定返回“bool”->返回类型可能需要更改为“bool”
我有一个类似的问题,一个用户类型做了几乎相同的事情。我发现在我的查询中明确地说明了等式解决了这个问题 尝试从以下位置开始:
var pList = Session.Query<Test>().Where( c => c.Active ).ToList();
var pList=Session.Query().Where(c=>c.Active.ToList();
致:
var pList=Session.Query().Where(c=>c.Active==true.ToList();
出于某种原因,NHibernate的Linq提供程序可以解决这个问题。在4.1.0版中修复。
用户类型应实现IEnhancedUserType以正确使用修复程序。
我也在寻找解决方案。我在NullSafeGet()中设置了一个断点,但代码执行没有达到该断点,因此Linq where子句没有调用IUserType转换。不,我没有解决这个问题。我根据你的建议试过了,但结果是一样的。我认为这是LINQ实现的一个问题。如果我在QueryOver中使用UserType,它将按预期工作。
NHibernate.QueryException: Unable to render boolean literal value [.Where[Core.Test.Domain.Test]
(NHibernate.Linq.NhQueryable`1[Core.Test.Domain.Test], Quote((c, ) => (c.Active)), )]
---> System.InvalidCastException: Das Objekt des Typs "NHibernate.Type.CustomType" kann nicht
in Typ "NHibernate.Type.BooleanType" umgewandelt werden.
{
public class BooleanM1 : IUserType
{
public bool IsMutable
{
get { return false; }
}
public Type ReturnedType
{
get { return typeof(bool); }
}
public SqlType[] SqlTypes
{
get { return new[]{NHibernateUtil.Int16.SqlType}; }
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]);
if(obj == null ) return false;
return ((string)obj == "-1" || (string)obj == "1") ? true : false;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if(value == null)
{
((IDataParameter) cmd.Parameters[index]).Value = DBNull.Value;
}
else
{
((IDataParameter) cmd.Parameters[index]).Value = (bool)value ? -1 : 0;
}
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
public new bool Equals(object x, object y)
{
if( ReferenceEquals(x,y) ) return true;
if( x == null || y == null ) return false;
return x.Equals(y);
}
public int GetHashCode(object x)
{
return x == null ? typeof(bool).GetHashCode() + 473 : x.GetHashCode();
}
}
public Type ReturnedType
{
get { return typeof(bool?); }
}
var pList = Session.Query<Test>().Where( c => c.Active ).ToList();
var pList = Session.Query<Test>().Where( c => c.Active == true ).ToList();