/// <summary> /// Get a batch of all unloaded identifiers for a given persister that are present in the cached query. /// Once this method is called the unloaded identifiers for a given persister will be cleared in order to prevent /// double checking the same identifier. /// </summary> /// <param name="persister">The persister for the entities being loaded.</param> /// <param name="id">The identifier of the entity currently demanding load.</param> /// <returns> /// An array of identifiers that can be empty if the identifier was already checked or <see langword="null" /> /// if the identifier is not present in the cached query. /// </returns> internal object[] GetEntityBatch(IEntityPersister persister, object id) { if (!_queryEntityKeys.TryGetValue(persister.EntityName, out var entityKeys)) { return(null); // The entity was not present in the cached query } var entityKey = new EntityKey(id, persister); if (_queryCheckedEntityKeys.TryGetValue(persister.EntityName, out var checkedEntityKeys) && checkedEntityKeys.Contains(entityKey)) { return(Array.Empty <object>()); } if (!entityKeys.Contains(entityKey)) { return(null); // The entity was not present in the cached query } var result = new object[entityKeys.Count]; var i = 0; result[i++] = id; if (checkedEntityKeys == null) { checkedEntityKeys = new HashSet <EntityKey>(); _queryCheckedEntityKeys.Add(persister.EntityName, checkedEntityKeys); } foreach (var key in entityKeys) { if (persister.IdentifierType.IsEqual(id, key.Identifier) || _persistenceContext.ContainsEntity(key)) { continue; } result[i++] = key.Identifier; checkedEntityKeys.Add(key); } entityKeys.Clear(); return(result); }