Ejemplo n.º 1
0
        public static Tuple <FieldDefinition, int, IOrmLiteConverter>[] GetIndexFieldsCache(this IDataReader reader, ModelDefinition modelDefinition, IOrmLiteDialectProvider dialect)
        {
            var cache              = new List <Tuple <FieldDefinition, int, IOrmLiteConverter> >();
            var ignoredFields      = modelDefinition.IgnoredFieldDefinitions;
            var remainingFieldDefs = modelDefinition.FieldDefinitionsArray
                                     .Where(x => !ignoredFields.Contains(x) && x.SetValueFn != null).ToList();

            for (var i = 0; i < reader.FieldCount; i++)
            {
                var columnName = reader.GetName(i);
                var fieldDef   = modelDefinition.GetFieldDefinition(columnName);

                if (fieldDef != null && !ignoredFields.Contains(fieldDef) && fieldDef.SetValueFn != null)
                {
                    remainingFieldDefs.Remove(fieldDef);
                    cache.Add(Tuple.Create(fieldDef, i, dialect.GetConverterBestMatch(fieldDef)));
                }
            }

            foreach (var fieldDef in remainingFieldDefs)
            {
                var index = FindColumnIndex(reader, dialect, fieldDef);
                if (index != NotFound)
                {
                    cache.Add(Tuple.Create(fieldDef, index, dialect.GetConverterBestMatch(fieldDef)));
                }
            }

            return(cache.ToArray());
        }
        public static Tuple <FieldDefinition, int, IOrmLiteConverter>[] GetIndexFieldsCache(this IDataReader reader,
                                                                                            ModelDefinition modelDefinition,
                                                                                            IOrmLiteDialectProvider dialect,
                                                                                            HashSet <string> onlyFields = null,
                                                                                            int startPos = 0,
                                                                                            int?endPos   = null)
        {
            var cache              = new List <Tuple <FieldDefinition, int, IOrmLiteConverter> >();
            var ignoredFields      = modelDefinition.IgnoredFieldDefinitions;
            var remainingFieldDefs = modelDefinition.FieldDefinitionsArray
                                     .Where(x => !ignoredFields.Contains(x) && x.SetValueFn != null).ToList();

            var end = endPos.GetValueOrDefault(reader.FieldCount);

            for (var i = startPos; i < end; i++)
            {
                var columnName = reader.GetName(i);
                var fieldDef   = modelDefinition.GetFieldDefinition(columnName);
                if (fieldDef == null)
                {
                    foreach (var def in modelDefinition.FieldDefinitionsArray)
                    {
                        if (string.Equals(dialect.NamingStrategy.GetColumnName(def.FieldName), columnName,
                                          StringComparison.OrdinalIgnoreCase))
                        {
                            fieldDef = def;
                            break;
                        }
                    }
                }

                if (fieldDef != null && !ignoredFields.Contains(fieldDef) && fieldDef.SetValueFn != null)
                {
                    remainingFieldDefs.Remove(fieldDef);
                    cache.Add(Tuple.Create(fieldDef, i, dialect.GetConverterBestMatch(fieldDef)));
                }
            }

            if (remainingFieldDefs.Count > 0 && onlyFields == null)
            {
                var dbFieldMap = new Dictionary <string, int>(StringComparer.InvariantCultureIgnoreCase);
                for (var i = startPos; i < end; i++)
                {
                    var fieldName = reader.GetName(i);
                    dbFieldMap[fieldName] = i;
                }

                foreach (var fieldDef in remainingFieldDefs)
                {
                    var index = FindColumnIndex(dialect, fieldDef, dbFieldMap);
                    if (index != NotFound)
                    {
                        cache.Add(Tuple.Create(fieldDef, index, dialect.GetConverterBestMatch(fieldDef)));
                    }
                }
            }

            return(cache.ToArray());
        }
    /// <summary>
    /// Initializes the database parameter.
    /// </summary>
    /// <param name="dialect">The dialect.</param>
    /// <param name="dbParam">The database parameter.</param>
    /// <param name="columnType">Type of the column.</param>
    /// <param name="value">The value.</param>
    public static void InitDbParam(this IOrmLiteDialectProvider dialect, IDbDataParameter dbParam, Type columnType, object value)
    {
        var converter = dialect.GetConverterBestMatch(columnType);

        converter.InitDbParam(dbParam, columnType);
        dbParam.Value = converter.ToDbValue(columnType, value);
    }
        public static T ConvertToValueTuple <T>(this IDataReader reader, object[] values, IOrmLiteDialectProvider dialectProvider)
        {
            var row        = typeof(T).CreateInstance();
            var typeFields = TypeFields.Get(typeof(T));

            values = reader.PopulateValues(values, dialectProvider);

            for (var i = 0; i < reader.FieldCount; i++)
            {
                var itemName = "Item" + (i + 1);
                var field    = typeFields.GetAccessor(itemName);
                if (field == null)
                {
                    break;
                }

                var fieldType = field.FieldInfo.FieldType;
                var converter = dialectProvider.GetConverterBestMatch(fieldType);

                var dbValue = converter.GetValue(reader, i, values);
                if (dbValue == null)
                {
                    continue;
                }

                if (dbValue.GetType() == fieldType)
                {
                    field.PublicSetterRef(ref row, dbValue);
                }
                else
                {
                    var fieldValue = converter.FromDbValue(fieldType, dbValue);
                    field.PublicSetterRef(ref row, fieldValue);
                }
            }
            return((T)row);
        }
        internal static T ToScalar <T>(IOrmLiteDialectProvider dialectProvider, IDataReader reader, int columnIndex = 0)
        {
            var nullableType = Nullable.GetUnderlyingType(typeof(T));

            if (nullableType != null)
            {
                object oValue = reader.GetValue(columnIndex);
                if (oValue == DBNull.Value)
                {
                    return(default(T));
                }
            }

            var underlyingType = nullableType ?? typeof(T);

            if (underlyingType == typeof(object))
            {
                return((T)reader.GetValue(0));
            }

            var converter = dialectProvider.GetConverterBestMatch(underlyingType);

            if (converter != null)
            {
                object oValue = converter.GetValue(reader, columnIndex, null);
                if (oValue == null)
                {
                    return(default(T));
                }

                var convertedValue = converter.FromDbValue(underlyingType, oValue);
                return(convertedValue == null ? default(T) : (T)convertedValue);
            }

            return((T)reader.GetValue(0));
        }