private static QueryResultScope <TEntity> CreateEntity <TEntity>( IQuerySource querySource, QueryContext queryContext, QueryResultScope parentQueryResultScope, ValueBuffer valueBuffer, int valueBufferOffset, IEntityType entityType, bool queryStateManager, EntityKeyFactory entityKeyFactory, IReadOnlyList <IProperty> keyProperties, Func <ValueBuffer, object> materializer) where TEntity : class { valueBuffer = valueBuffer.WithOffset(valueBufferOffset); var entityKey = entityKeyFactory.Create(keyProperties, valueBuffer); return(new QueryResultScope <TEntity>( querySource, entityKey != EntityKey.InvalidEntityKey ? (TEntity)queryContext.QueryBuffer .GetEntity( entityType, entityKey, new EntityLoadInfo( valueBuffer, materializer), queryStateManager) : null, parentQueryResultScope)); }
private static QueryResultScope <ValueBuffer> CreateValueBuffer( IQuerySource querySource, QueryContext queryContext, QueryResultScope parentQueryResultScope, ValueBuffer valueBuffer, int valueBufferOffset) => new QueryResultScope <ValueBuffer>( querySource, valueBuffer.WithOffset(valueBufferOffset), parentQueryResultScope);
private static QueryResultScope <TEntity> CreateEntity <TEntity>( IQuerySource querySource, QueryContext queryContext, QueryResultScope parentQueryResultScope, ValueBuffer valueBuffer, int valueBufferOffset, IEntityType entityType, bool queryStateManager, EntityKeyFactory entityKeyFactory, IReadOnlyList <IProperty> keyProperties, Func <ValueBuffer, object> materializer, bool allowNullResult) where TEntity : class { valueBuffer = valueBuffer.WithOffset(valueBufferOffset); var entityKey = entityKeyFactory.Create(keyProperties, valueBuffer); TEntity entity = null; if (entityKey == EntityKey.InvalidEntityKey) { if (!allowNullResult) { throw new InvalidOperationException(RelationalStrings.InvalidKeyValue(entityType.DisplayName())); } } else { entity = (TEntity)queryContext.QueryBuffer .GetEntity( entityType, entityKey, new EntityLoadInfo(valueBuffer, materializer), queryStateManager); } return(new QueryResultScope <TEntity>(querySource, entity, parentQueryResultScope)); }
public override Expression Visit(Expression expression) { var selectExpression = QueryModelVisitor.TryGetQuery(_querySource); if (expression != null && !(expression is ConstantExpression) && selectExpression != null) { var sqlExpression = new SqlTranslatingExpressionVisitor( _queryModelVisitor, selectExpression, inProjection: true) .Visit(expression); if (sqlExpression == null) { if (!(expression is QuerySourceReferenceExpression)) { _requiresClientEval = true; } } else { if (!(expression is NewExpression)) { AliasExpression aliasExpression; int index; if (!(expression is QuerySourceReferenceExpression)) { var columnExpression = sqlExpression.TryGetColumnExpression(); if (columnExpression != null) { index = selectExpression.AddToProjection(sqlExpression); aliasExpression = selectExpression.Projection[index] as AliasExpression; if (aliasExpression != null) { aliasExpression.SourceExpression = expression; } return(expression); } } if (!(sqlExpression is ConstantExpression)) { index = selectExpression.AddToProjection(sqlExpression); aliasExpression = selectExpression.Projection[index] as AliasExpression; if (aliasExpression != null) { aliasExpression.SourceExpression = expression; } return (QueryModelVisitor.BindReadValueMethod( expression.Type, QueryResultScope.GetResult( EntityQueryModelVisitor.QueryResultScopeParameter, _querySource, typeof(ValueBuffer)), index)); } } } } return(base.Visit(expression)); }
public override Expression Visit(Expression expression) { var selectExpression = QueryModelVisitor.TryGetQuery(_querySource); if (expression != null && !(expression is ConstantExpression) && selectExpression != null) { var sqlExpression = _sqlTranslatingExpressionVisitorFactory .Create(QueryModelVisitor, selectExpression, inProjection: true) .Visit(expression); if (sqlExpression == null) { if (!(expression is QuerySourceReferenceExpression)) { QueryModelVisitor.RequiresClientProjection = true; } } else { if (!(expression is NewExpression)) { AliasExpression aliasExpression; int index; if (!(expression is QuerySourceReferenceExpression)) { var columnExpression = sqlExpression.TryGetColumnExpression(); if (columnExpression != null) { index = selectExpression.AddToProjection(sqlExpression); aliasExpression = selectExpression.Projection[index] as AliasExpression; if (aliasExpression != null) { aliasExpression.SourceExpression = expression; } return(expression); } } if (!(sqlExpression is ConstantExpression)) { index = selectExpression.AddToProjection(sqlExpression); aliasExpression = selectExpression.Projection[index] as AliasExpression; if (aliasExpression != null) { aliasExpression.SourceExpression = expression; } var valueBufferExpression = QueryResultScope.GetResult( EntityQueryModelVisitor.QueryResultScopeParameter, _querySource, typeof(ValueBuffer)); var readValueExpression = _entityMaterializerSource .CreateReadValueCallExpression(valueBufferExpression, index); var outputDataInfo = (expression as SubQueryExpression)?.QueryModel .GetOutputDataInfo(); if (outputDataInfo is StreamedScalarValueInfo) { // Compensate for possible nulls readValueExpression = Expression.Coalesce( readValueExpression, Expression.Default(expression.Type)); } return(Expression.Convert(readValueExpression, expression.Type)); } } } } return(base.Visit(expression)); }