private IMappedExpression BuildField(Type type, ref int index, ref IEnumerable <Type> types)
        {
//      if (type.IsOfGenericType(typeof (Ref<>))) {
//        var entityType = type.GetGenericType(typeof (Ref<>)).GetGenericArguments()[0];
//        TypeInfo typeInfo = model.Types[entityType];
//        KeyInfo keyProviderInfo = typeInfo.KeyInfo;
//        TupleDescriptor keyTupleDescriptor = keyProviderInfo.TupleDescriptor;
//        KeyExpression entityExpression = KeyExpression.Create(typeInfo, index);
//        index += keyTupleDescriptor.Count;
//        types = types.Concat(keyTupleDescriptor);
//        return Expression.Convert(entityExpression, type);
//      }

            if (type.IsSubclassOf(typeof(Entity)))
            {
                TypeInfo          typeInfo           = model.Types[type];
                KeyInfo           keyInfo            = typeInfo.Key;
                TupleDescriptor   keyTupleDescriptor = keyInfo.TupleDescriptor;
                IMappedExpression expression;
                if (isKeyConverter)
                {
                    expression = KeyExpression.Create(typeInfo, index);
                }
                else
                {
                    var entityExpression = EntityExpression.Create(typeInfo, index, true);
                    entityExpression.IsNullable = true;
                    expression = entityExpression;
                }
                index += keyTupleDescriptor.Count;
                types  = types.Concat(keyTupleDescriptor);
                return(expression);
            }

            if (type.IsSubclassOf(typeof(Structure)))
            {
                TypeInfo            typeInfo            = model.Types[type];
                TupleDescriptor     tupleDescriptor     = typeInfo.TupleDescriptor;
                var                 tupleSegment        = new Segment <int>(index, tupleDescriptor.Count);
                StructureExpression structureExpression = StructureExpression.CreateLocalCollectionStructure(typeInfo, tupleSegment);
                index += tupleDescriptor.Count;
                types  = types.Concat(tupleDescriptor);
                return(structureExpression);
            }

            if (TypeIsStorageMappable(type))
            {
                ColumnExpression columnExpression = ColumnExpression.Create(type, index);
                types = types.AddOne(type);
                index++;
                return(columnExpression);
            }

            throw new NotSupportedException();
        }