Пример #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());
        }