Example #1
0
        internal EntityReader(Stream stream, FastDatabase dbm)
        {
            this.Stream       = stream;
            this.info         = dbm.GetTable(typeof(T)).Info;
            this.fieldReaders = dbm.Meta[typeof(T)];

            this.recordLength = fieldReaders.Sum(r => r.FieldLength());

            hiddenRefSources = info.ReferenceSources
                               .Where(p => !MultiReference.IsReal(p));

            var sourceTypes = info.EntityType.GetProperties()
                              .Where(MultiReference.IsReal)
                              .Select(MultiReference.SourceType);

            fieldSetters = fieldReaders
                           .Select(delegate(FieldReader r)
            {
                if (r is ColumnReader)
                {
                    return(info.BuildColumnSetter(r.Type, r.Name));
                }
                else if (r is ForeignKeyReader)
                {
                    return(info.BuildKeySetter(r.Type, r.Name));
                }
                else
                {
                    return(sourceTypes.Contains(r.Type) ?
                           createSourceSetter(r.Type, info.EntityType)
                        : (Action <object, object>)null);
                }
            })
                           .Select(r => r ?? emptySetter)
                           .ToArray();

            stream.Read(buffer, 0, sizeof(int));
            TotalRecords = BitConverter.ToInt32(buffer, 0);
        }