首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IUserType的NHibernate linq查询

使用IUserType的NHibernate linq查询
EN

Stack Overflow用户
提问于 2011-08-15 18:35:33
回答 3查看 2.2K关注 0票数 11

在我的项目中,我使用了一个处理布尔值的IUserType (BooleanM1),并将-1表示true,0表示false值写入数据库。到目前为止,一切都运行良好。映射如下所示:

代码语言:javascript
复制
<property name="Active" column="ACTIVE" type="Core.Persistence.NH.Types.BooleanM1,Core.Test"/>

因此,如果我执行如下查询

代码语言:javascript
复制
var pList = Session.Query<Test>().Where( c => c.Active ).ToList();

抛出一个异常:

代码语言:javascript
复制
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实现如下所示:

代码语言:javascript
复制
{
  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有什么问题?任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-12 03:15:00

我在UserType上也遇到了类似的问题,它做的事情几乎是一样的。我发现在我的查询中明确地声明相等解决了这个问题。

尝试从以下位置开始:

代码语言:javascript
复制
var pList = Session.Query<Test>().Where( c => c.Active ).ToList();

至:

代码语言:javascript
复制
var pList = Session.Query<Test>().Where( c => c.Active == true ).ToList();

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

票数 9
EN

Stack Overflow用户

发布于 2011-09-01 15:42:11

你已经解决这个问题了吗?

不确定这是否是相同的问题,但我有一些类似的东西,数据库字段可以为空,而自定义类型指定您正在返回一个"bool“->它可能需要更改为"bool”用于返回类型。

代码语言:javascript
复制
 public Type ReturnedType
 {
    get { return typeof(bool?); }
 }
票数 2
EN

Stack Overflow用户

发布于 2016-12-29 02:12:40

已在版本4.1.0中修复。用户类型应实现IEnhancedUserType才能正确使用修复程序。https://nhibernate.jira.com/browse/NH-2839

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7063976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档