public static ModificationResult Delete <T>(this Session session, CriteriaOperator criteria) where T : IXPObject
        {
            if (ReferenceEquals(criteria, null))
            {
                criteria = CriteriaOperator.Parse("True");
            }
            XPClassInfo classInfo = session.GetClassInfo(typeof(T));
            /// if you are using DevExpress 11.2 or earlier
            /// var batchWideData = new BatchWideDataHolder(session);
            var batchWideData   = new BatchWideDataHolder4Modification(session);
            int recordsAffected = (int)session.Evaluate <T>(CriteriaOperator.Parse("Count()"), criteria);
            /// if you are using DevExpress 13.1.5 or earlier
            /// List<ModificationStatement> collection = DeleteQueryGenerator.GenerateDelete(classInfo, criteria, batchWideData);
            List <ModificationStatement> collection = DeleteQueryGenerator.GenerateDelete(classInfo, ObjectGeneratorCriteriaSet.GetCommonCriteriaSet(criteria), batchWideData);

            foreach (ModificationStatement item in collection)
            {
                item.RecordsAffected = recordsAffected;
            }
            ModificationStatement[] collectionToArray = collection.ToArray <ModificationStatement>();
            ModificationResult      result            = session.DataLayer.ModifyData(collectionToArray);

            return(result);
        }