private static Variance keyedTypedHomogeneousObjectEnumerableCompare <T, TSubType>(IdPropertyAttribute idAttribute, T val1, T val2, string fieldName)
    {
        var idMember = typeof(TSubType).GetMember(idAttribute.IdProperty).FirstOrDefault();

        if (idMember == null)
        {
            throw new IdMemberNotFoundException(idAttribute.IdProperty, typeof(TSubType).FullName);
        }
        var subMethod = typeof(TExtensions)
                        .GetMethod("subTypedKeyedTypedHomogeneousObjectEnumerableCompare", BindingFlags.Static, null, new [] { typeof(T), typeof(T), typeof(String) }, null)
                        .MakeGenericMethod(new [] { typeof(T), typeof(TSubType), (idMember is PropertyInfo ? ((PropertyInfo)idMember).PropertyType : ((FieldInfo)idMember).FieldType) });

        return((Variance)subMethod.Invoke(null, new object[] { val1, val2, fieldName, idMember }));
    }
 private void GenerateIdBody(IdPropertyAttribute attribute)
 {
     bodyString += commaString(string.Format("{0} bigint NOT NULL", attribute.FieldName));
     primaryKey = attribute;
 }