簡體   English   中英

NHibernate linq 使用 IUserType 查詢

[英]NHibernate linq query with IUserType

在我的項目中,我使用了一個 IUserType (BooleanM1) 來處理 boolean 值並將 -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 提供程序隨后能夠弄清楚。

你解決了嗎?

不確定這是否是同一個問題,但我有類似的情況,數據庫字段可以為空並且自定義類型指定您返回“bool”->它可能需要更改為“bool?返回類型”

 public Type ReturnedType
 {
    get { return typeof(bool?); }
 }

已在 4.1.0 版中修復。 用戶類型應實現 IEnhancedUserType 以正確使用該修復程序。 https://nhibernate.jira.com/browse/NH-2839

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM