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(); }
private ProjectionExpression GetIndexBinding(LambdaExpression le, ref ProjectionExpression sequence) { if (le.Parameters.Count == 2) { var indexDataSource = sequence.ItemProjector.DataSource.RowNumber(context.GetNextColumnAlias()); var columnExpression = ColumnExpression.Create(typeof(long), indexDataSource.Header.Columns.Count - 1); var indexExpression = Expression.Subtract(columnExpression, Expression.Constant(1l)); var itemExpression = Expression.Convert(indexExpression, typeof(int)); var indexItemProjector = new ItemProjectorExpression(itemExpression, indexDataSource, context); var indexProjectionExpression = new ProjectionExpression(typeof(long), indexItemProjector, sequence.TupleParameterBindings); var sequenceItemProjector = sequence.ItemProjector.Remap(indexDataSource, 0); sequence = new ProjectionExpression( sequence.Type, sequenceItemProjector, sequence.TupleParameterBindings, sequence.ResultType); return(indexProjectionExpression); } return(null); }