/// <summary> Execute native query and convert results.
        /// Multi-threaded result convertion
        /// </summary>
        /// <typeparam name="TRes">query results item data type</typeparam>
        /// <param name="queryString">native query text</param>
        /// <param name="setParamsMethod">quert parameters setter delegate</param>
        /// <param name="convertMethod">query result converter delegate</param>
        /// <param name="maxThreads">max number of threads for async convert query results (don't use less then 2)</param>
        /// <returns>converted native query result</returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="queryString"/> is null.
        /// <paramref name="convertMethod"/> is null.
        /// </exception>
        /// <exception cref="ArgumentOutOfRangeException">
        /// <paramref name="maxThreads"/> has not supported value.
        /// </exception>
        /// <remarks>
        /// Try to use HQL, Linq-To-NHibernate and other ORM services and tools.
        /// </remarks>
        protected IList <TRes> ExecuteNativeQuery <TRes>(string queryString, SetQueryParameters setParamsMethod
                                                         , ConvertData <TRes> convertMethod, ushort maxThreads) where TRes : T
        {
            if (string.IsNullOrEmpty(queryString))
            {
                throw new ArgumentNullException("queryString");
            }
            if (null == convertMethod)
            {
                throw new ArgumentNullException("convertMethod");
            }
            if (1 == maxThreads)
            {
                //I18N
                throw new ArgumentOutOfRangeException("maxThreads", maxThreads, "Don't use 1(one) for maxThreads parameter. It's not make sence");
            }
            IQuery q = this.Session.CreateSQLQuery(queryString);

            if (null != setParamsMethod)
            {
                q = setParamsMethod.Invoke(q);
            }
            var resList = q.List();

            object[]    data;
            List <TRes> res = new List <TRes>(resList.Count);

            foreach (var item in resList)
            {
                data = (object[])item;
                //TODO: implement multi-threaded results convertion
                res.Add(convertMethod.Invoke(data));
            }
            return(res);
        }
 /// <summary> Execute native query and convert results.
 /// Convert results in main thread
 /// </summary>
 /// <typeparam name="TRes">query results item data type</typeparam>
 /// <param name="queryString">native query text</param>
 /// <param name="setParamsMethod">quert parameters setter delegate</param>
 /// <param name="convertMethod">query result converter delegate</param>
 /// <returns>converted native query result</returns>
 /// <exception cref="ArgumentNullException">
 /// <paramref name="queryString"/> is null.
 /// <paramref name="convertMethod"/> is null.
 /// </exception>
 /// <remarks>
 /// Try to use HQL, Linq-To-NHibernate and other ORM services and tools
 /// </remarks>
 protected IList <TRes> ExecuteNativeQuery <TRes>(string queryString, SetQueryParameters setParamsMethod
                                                  , ConvertData <TRes> convertMethod) where TRes : T
 {
     return(ExecuteNativeQuery <TRes>(queryString, setParamsMethod, convertMethod, 0));
 }