public static ModificationResult Update <T>(this Session session, Expression <Func <T> > evaluator, CriteriaOperator criteria) where T : IXPObject { if (ReferenceEquals(criteria, null)) { criteria = CriteriaOperator.Parse("True"); } XPClassInfo classInfo = session.GetClassInfo(typeof(T)); var batchWideData = new BatchWideDataHolder4Modification(session); var recordsAffected = (int)session.Evaluate <T>(CriteriaOperator.Parse("Count()"), criteria); PropertyValueStore propertyValueStore = null; int memberInitCount = 1; evaluator.Visit <MemberInitExpression>(expression => { if (memberInitCount > 1) { throw new NotImplementedException("Only a single MemberInitExpression is allowed for the evaluator parameter."); } memberInitCount++; propertyValueStore = CreatePropertyValueStore(classInfo, expression); return(expression); }); var properties = new MemberInfoCollection(classInfo, propertyValueStore.Select(x => x.Key).ToArray()); List <ModificationStatement> collection = UpdateQueryGenerator.GenerateUpdate(classInfo, properties, ObjectGeneratorCriteriaSet.GetCommonCriteriaSet(criteria), batchWideData); foreach (UpdateStatement updateStatement in collection.OfType <UpdateStatement>()) { for (int i = 0; i < updateStatement.Parameters.Count; i++) { Object value = propertyValueStore[i].Value; if (value is IXPObject) { updateStatement.Parameters[i].Value = ((IXPObject)(value)).ClassInfo.GetId(value); } else { updateStatement.Parameters[i].Value = value; } } updateStatement.RecordsAffected = recordsAffected; } return(session.DataLayer.ModifyData(collection.ToArray <ModificationStatement>())); }
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)); var batchWideData = new BatchWideDataHolder4Modification(session); var recordsAffected = (int)session.Evaluate <T>(CriteriaOperator.Parse("Count()"), criteria); 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); }