示例#1
0
        /// <summary>
        /// Call this method for any custom SQL statement. Not recomment to use this.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sqlBuilder"></param>
        /// <returns></returns>
        public List <T> Execute <T>(SqlBuilder sqlBuilder)
        {
            DataServiceClient client = new DataServiceClient(this.ConnectionString);

            try
            {
                if (this.CommandTimeout.HasValue)
                {
                    client.CommandTimeout = this.CommandTimeout;
                }

                var result = new List <T>();

                var sql = sqlBuilder.Sql;

                var dataSource = client.Execute(sql);
                if (typeof(DataSource).IsAssignableFrom(typeof(T)))
                {
                    (result as IList).Add(dataSource);
                    return(result);
                }

                var properties   = typeof(T).GetProperties();
                var propertyDict = new Dictionary <string, PropertyInfo>();
                foreach (var propertyInfo in properties)
                {
                    propertyDict.Add(propertyInfo.Name.ToUpper(), propertyInfo);
                }

                // in case the Column name in tables or stored procedures contains char which invalid for build Property in class
                //for (var i = 0; i < dataSource.ColumnNames.Length; i++)
                //    dataSource.ColumnNames[i] = ConvertToValidPropertyName(dataSource.ColumnNames[i]);

                var columnNames = new List <string>();
                for (var i = 0; i < dataSource.ColumnInfos.Count; i++)
                {
                    columnNames.Add(ValidateColumnName(dataSource.ColumnInfos[i].Name).ToUpper());
                }

                foreach (var row in dataSource.Rows)
                {
                    var newItem = (T)typeof(T).GetDefaultValue();
                    for (var i = 0; i < dataSource.ColumnInfos.Count; i++)
                    {
                        var columnName = columnNames[i];
                        if (propertyDict.ContainsKey(columnName))
                        {
                            var property = propertyDict[columnName];
                            property.SetValue(newItem, row.Columns[i].ConvertToTargetTypeValue(property.PropertyType), null);
                        }
                    }
                    if (newItem is IModified)
                    {
                        (newItem as IModified).IsModified = false;
                    }
                    if (newItem is IPropertyModified)
                    {
                        (newItem as IPropertyModified).MarkAsDefault();
                    }

                    result.Add(newItem);
                }

                return(result);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                //if (client.State != CommunicationState.Faulted)
                //    client.Close();
            }
        }