gpt4 book ai didi

c# - 带有 IUserType 的 NHibernate linq 查询

转载 作者:可可西里 更新时间:2023-11-01 08:43:51 27 4
gpt4 key购买 nike

在我的项目中,我使用 IUserType (BooleanM1) 来处理 bool 值并将 -1 表示为真,0 表示为假值写入数据库。到目前为止一切正常。映射看起来像这个:

<property name="Active" column="ACTIVE" type="Core.Persistence.NH.Types.BooleanM1,Core.Test"/>

所以如果我做如下查询

var pList = Session.Query<Test>().Where( c => c.Active ).ToList();

抛出异常:

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.

BooleanM1 的实现是这样的:

{
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 提供程序中的已知错误还是我的 UserType 有问题?感谢您的帮助。

最佳答案

我在做几乎相同事情的 UserType 时遇到了类似的问题。我发现在我的查询中明确声明相等性可以解决问题。

尝试从:

var pList = Session.Query<Test>().Where( c => c.Active ).ToList();

到:

var pList = Session.Query<Test>().Where( c => c.Active == true ).ToList();

出于某种原因,NHibernate 的 Linq 提供程序随后能够解决这个问题。

关于c# - 带有 IUserType 的 NHibernate linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7063976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com