Exemple #1
0
        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>()));
        }
Exemple #2
0
        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);
        }