/// <summary> /// Gets the column names for the entity reference specified. /// </summary> /// <param name="entityReference"> /// The entity reference. /// </param> /// <returns> /// The column names. /// </returns> internal IEnumerable<string> ColumnNames(EntityReference entityReference) { var distinctColumnBindings = this.DistinctColumnBindingsForType(entityReference.EntityType).ToList(); if (distinctColumnBindings.Count <= 1) { return distinctColumnBindings.Select(ColumnName); } var columnBindingComparer = new ColumnBindingComparer(); var columnFamilyBindings = new Dictionary<string, HashSet<IColumnBinding>>(StringComparer.Ordinal); foreach (var binding in distinctColumnBindings) { HashSet<IColumnBinding> columnBindings; if (!columnFamilyBindings.TryGetValue(binding.ColumnFamily, out columnBindings)) { columnFamilyBindings.Add(binding.ColumnFamily, columnBindings = new HashSet<IColumnBinding>(columnBindingComparer)); } columnBindings.Add(binding); } var registeredColumnNames = this.RegisteredColumnNames(); foreach (var binding in distinctColumnBindings.Where(b => b.ColumnQualifier != null)) { ISet<string> columnQualifiers; if (registeredColumnNames.TryGetValue(binding.ColumnFamily, out columnQualifiers)) { if (columnQualifiers.Remove(binding.ColumnQualifier) && columnQualifiers.Count == 0) { columnFamilyBindings[binding.ColumnFamily] = new HashSet<IColumnBinding> { new ColumnBinding(binding.ColumnFamily) }; } } } return columnFamilyBindings.Values.SelectMany(s => s).Select(ColumnName); }
/// <summary> /// Reads all entities which belongs to the given scan specification from the database. /// </summary> /// <param name="entityContext"> /// The entity context. /// </param> /// <param name="entityReference"> /// The entity reference. /// </param> /// <param name="scanSpec"> /// The scan spec. /// </param> /// <param name="entitySink"> /// The entity sink, receives the entities fetched. /// </param> /// <param name="behaviors"> /// The behaviors. /// </param> internal static void Read(EntityContext entityContext, EntityReference entityReference, ScanSpec scanSpec, Action<object> entitySink, Behaviors behaviors) { var entityScanResult = new EntityScanResult(entityReference, entitySink); var entityScanner = new EntityScanner(entityContext); entityScanner.Add(entityScanResult, scanSpec); new EntityReader(entityScanner, behaviors).Read(); }
/// <summary> /// The deserializing entity callback. /// </summary> /// <param name="entityReference"> /// The entity reference. /// </param> /// <param name="destinationType"> /// The destination type. /// </param> /// <param name="entity"> /// The entity. /// </param> private void DeserializingEntity(EntityReference entityReference, Type destinationType, object entity) { this.entitiesFetched.TryAdd(this.fetchedCell.EntityScanTarget, entity); entityReference.SetKey(entity, this.fetchedCell.Cell.Key); }
/// <summary> /// Reads all entities which belongs to the given scan specification from the database. /// </summary> /// <param name="entityContext"> /// The entity context. /// </param> /// <param name="entityReference"> /// The entity reference. /// </param> /// <param name="scanSpec"> /// The scan spec. /// </param> /// <param name="behaviors"> /// The behaviors. /// </param> /// <returns> /// The entities. /// </returns> internal static IEnumerable Read(EntityContext entityContext, EntityReference entityReference, ScanSpec scanSpec, Behaviors behaviors) { var entityScanResult = new EntityScanResult(entityReference); var entityScanner = new EntityScanner(entityContext); entityScanner.Add(entityScanResult, scanSpec); new EntityReader(entityScanner, behaviors).Read(); return entityScanResult.Values; }
/// <summary> /// Reads all entities which belongs to the given database keys from the database. /// </summary> /// <param name="entityContext"> /// The entity context. /// </param> /// <param name="entityReference"> /// The entity reference. /// </param> /// <param name="keys"> /// The entity keys. /// </param> /// <param name="entitySink"> /// The entity sink, receives the entities fetched. /// </param> /// <param name="behaviors"> /// The behaviors. /// </param> internal static void Read(EntityContext entityContext, EntityReference entityReference, IEnumerable keys, Action<object> entitySink, Behaviors behaviors) { var entityScanner = new EntityScanner(entityContext); var entityScanTargets = new ChunkedCollection<EntityScanTarget>(); foreach (var key in keys) { if (key != null) { var entityScanTarget = new EntityScanTarget(entityReference, entityReference.GetKeyFromObject(key, false), entitySink); entityScanTargets.Add(entityScanTarget); entityScanner.Add(entityScanTarget); } } new EntityReader(entityScanner, behaviors).Read(); }
/// <summary> /// Reads an entity which belongs to the given database key from the database. /// </summary> /// <param name="entityContext"> /// The entity context. /// </param> /// <param name="entityReference"> /// The entity reference. /// </param> /// <param name="key"> /// The database key. /// </param> /// <param name="behaviors"> /// The behaviors. /// </param> /// <returns> /// The entity. /// </returns> internal static object Read(EntityContext entityContext, EntityReference entityReference, object key, Behaviors behaviors) { var entityScanTarget = new EntityScanTarget(entityReference, key); var entityScanner = new EntityScanner(entityContext); entityScanner.Add(entityScanTarget); new EntityReader(entityScanner, behaviors).Read(); return entityScanTarget.Value; }
/// <summary> /// Initializes a new instance of the <see cref="EntityReference"/> class. /// </summary> /// <param name="entityReference"> /// The entity reference. /// </param> /// <exception cref="ArgumentNullException"> /// If <paramref name="entityReference"/> is null. /// </exception> internal EntityReference(EntityReference entityReference) { if (entityReference == null) { throw new ArgumentNullException("entityReference"); } this.entityType = entityReference.entityType; this.tableBinding = entityReference.tableBinding; this.columnBinding = entityReference.columnBinding; this.keyBinding = entityReference.keyBinding; }