VB.NET2011.09.08 16:41

iBatis.net 에서 데이터 반환할때 QueryForObject, QueryForList 두가지 방식으로 반환을 하게 되는데, 보통 MSSQL SP 로 만들어진 비지니스 로직은 다중 결과셋을 반환할때가 많습니다.

아래 클래스는 제가 만들어본 클래스 입니다. 언어가 C# 이죠? ^^;

사용법은 다음과 같습니다.

IList resultset = (IList)Mapper.Instance().QueryForList(...)
ListSmart result = (ListSmart)(ArrayList)resultset; 
으로 캐스팅을 하게 되면 다중 결과셋이 같은 형식의 클래스로 묶입니다.
    /// <summary>
    /// iBatis 에서 반환된 1차원 리스트를 같은 데이터 타입끼리 묶어서 2차원 리스트로 반환(캐스팅 사용)
    /// </summary>
    public class ListSmart : IListICollection
    {
        internal List<object> Items = null;
 
        //리스트 갯수 반환
        public int Count { getset; }
        public string Test { getset; }
        public ListSmart(IList currentList)
        {
            Items = new List<object>();
            List<object> subList = null;
            Type oldType = null;
 
            foreach (object o in currentList)
            {
                Type t = o.GetType();
                if (t.Name != "Int32" && t.Name != "String"//숫자, 문자형 이외 추가될 타입은 여기에 추가
                {
                    if (oldType != t)
                    {
                        if (subList != null)
                        {
                            Items.Add(subList);
                            subList = null;
                        }
                        oldType = t;
                        subList = new List<object>();
                        subList.Add(o);
                    }
                    else
                    {
                        if (subList.Count > 0)
                        {
                            subList.Add(o);
                        }
                        else
                        {
                            Items.Add(o);
                        }
                    }
                }
                else
                {
                    Items.Add(o);
                }
 
            }
 
            if (subList != null && subList.Count > 0) Items.Add(subList);
 
            this.Count = Items.Count;
 
        }
       
        public static explicit operator ListSmart(List<object> obj)
        {
            return new ListSmart(obj);
        }
 
 
        public static explicit operator ListSmart(ArrayList obj)
        {
            List<object> lstResult = new List<object>();
 
            foreach (object o in obj)
            {
                lstResult.Add(o);
            }
 
            return new ListSmart(lstResult);
        }
 
 
        #region IList 멤버
 
        public int Add(object value)
        {
            this.Items.Add(value);
            return this.Count;
        }
 
        public void Clear()
        {
            this.Items.Clear();
        }
 
        public bool Contains(object value)
        {
            return this.Items.Contains(value);
        }
 
        public int IndexOf(object value)
        {
            return this.Items.IndexOf(value);
        }
 
        public void Insert(int index, object value)
        {
            this.Items.Insert(index, value);
        }
 
        public bool IsFixedSize
        {
            get { return false; }
        }
 
        public bool IsReadOnly
        {
            get { return false; }
        }
 
        public void Remove(object value)
        {
            this.Items.Remove(value);
        }
 
        public void RemoveAt(int index)
        {
            this.Items.RemoveAt(index);
        }
 
        public object this[int index]
        {
            get
            {
                return this.Items[index];
            }
            set
            {
                this.Items[index] = value;
            }
        }
 
        #endregion
 
        #region ICollection 멤버
 
        public void CopyTo(Array array, int index)
        {
            throw new NotImplementedException();
        }
 
        public bool IsSynchronized
        {
            get { throw new NotImplementedException(); }
        }
 
        public object SyncRoot
        {
            get { throw new NotImplementedException(); }
        }
 
        #endregion
 
        #region IEnumerable 멤버
 
        public IEnumerator GetEnumerator()
        {
            return (IEnumerator)this;
        }
 
        #endregion
    }
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by dotnetpower

티스토리 툴바