sql >> データベース >  >> RDS >> Sqlserver

NHibernate での SQL 2008 HierarchyID のサポート

    Needles の回答をテスト実行しました。これは非常に良い答えですが、機能させるにはいくつかの変更が必要です(少なくとも.NET 4では)。これが私のプロジェクトのために思いついたものです:

    更新: 次のコードは GitHub からダウンロードでき、そこで更新されます。 NHiberntate.HierarchyId.UserType

    SqlHierarchyId IUserType

    namespace NHibernate.UserTypes
    {
        using SqlTypes;
        using System;
        using System.Data;
        using System.Data.SqlTypes;
        using Microsoft.SqlServer.Types;
    
        public class HierarchyId : IUserType
        {
            #region Properties
    
            public SqlType[] SqlTypes
            {
                get { return new[] { NHibernateUtil.String.SqlType }; }
            }
    
            public Type ReturnedType
            {
                get { return typeof(SqlHierarchyId); }
            }
    
            public bool IsMutable
            {
                get { return true; }
            }
    
            #endregion Properties
    
            #region Methods
    
            new public 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.GetHashCode();
            }
    
            public object NullSafeGet(IDataReader rs, string[] names, object owner)
            {
                object prop1 = NHibernateUtil.String.NullSafeGet(rs, names[0]);
    
                if (prop1 == null) return null;
    
                return SqlHierarchyId.Parse(new SqlString(prop1.ToString()));
            }
    
            public void NullSafeSet(IDbCommand cmd, object value, int index)
            {
                if (value == null)
                    ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value;
    
                else if (value is SqlHierarchyId)
                    ((IDataParameter)cmd.Parameters[index]).Value = ((SqlHierarchyId)value).ToString();
            }
    
            public object DeepCopy(object value)
            {
                if (value == null) return null;
    
                return SqlHierarchyId.Parse(((SqlHierarchyId)value).ToString());
            }
    
            public object Replace(object original, object target, object owner)
            {
                return DeepCopy(original);
            }
    
            public object Assemble(object cached, object owner)
            {
                return DeepCopy(cached);
            }
    
            public object Disassemble(object value)
            {
                return DeepCopy(value);
            }
    
            #endregion Methods
        }
    }
      

    マッピング

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataLayer" namespace="NHibernate.Map">
        <class name="NHibernate.Map.OrganizationUnit, DataLayer" table="`orgunit`">
    
            <property name="HierarchyId" column="`ou_hid`" type="NHibernate.UserTypes.HierarchyId, DataLayer" />
            ...
    
        </class>
    </hibernate-mapping>
      

    HierarchyId を持つオブジェクト

    namespace NHibernate.Map
    {
        using Microsoft.SqlServer.Types;
    
        public class OrganizationUnit
        {
            #region Fields
    
            private SqlHierarchyId _hierarchyId;
            ...
    
            #endregion Fields
    
            #region Properties
    
            public virtual SqlHierarchyId HierarchyId
            {
                get { return _hierarchyId; }
                set { _hierarchyId = value; }
            }
            ...
    
            #endregion Properties
        }
    }
      

    1. 時間を考慮せずに日時列でグループ化するにはどうすればよいですか?

    2. foreachループの代わりにmysqlphp関数を結合します

    3. PHP/Mysqlの特殊文字の挿入が切り捨てられています

    4. 1対多のSQLSELECTを1行に