// checks whether a given globally identified entities from a given document are equal or not
        private bool AreEqual <TEntity>(IStonDocument document, IStonEntityEquivalenceComparer comparer, string id1, string id2)
            where TEntity : class, IStonEntity
        {
            var e1 = id1 != null?document.GetGlobalEntity(id1) : null;

            var e2 = id2 != null?document.GetGlobalEntity(id2) : null;

            if (typeof(TEntity) == typeof(IStonValuedEntity))
            {
                return(comparer.Equals(e1 as IStonValuedEntity, e2 as IStonValuedEntity));
            }
            else if (typeof(TEntity) == typeof(IStonSimpleEntity))
            {
                return(comparer.Equals(e1 as IStonSimpleEntity, e2 as IStonSimpleEntity));
            }
            else if (typeof(TEntity) == typeof(IStonComplexEntity))
            {
                return(comparer.Equals(e1 as IStonComplexEntity, e2 as IStonComplexEntity));
            }
            else if (typeof(TEntity) == typeof(IStonReferenceEntity))
            {
                return(comparer.Equals(e1 as IStonReferenceEntity, e2 as IStonReferenceEntity));
            }
            else
            {
                return(comparer.Equals(e1, e2));
            }
        }
 /// <summary>
 /// Creates a new STON member binding keys equivalence comparer, using a given entities equivalence comparer for index key parameters.
 /// </summary>
 /// <param name="indexParameterComparer">The entities equivalence comparer used for index key parameters.</param>
 public StonBindingKeyEquivalenceComparer(IStonEntityEquivalenceComparer indexParameterComparer)
 {
     if (indexParameterComparer == null)
     {
         throw new ArgumentNullException("indexParameterComparer");
     }
     IndexParameterComparer = indexParameterComparer;
 }