/// <summary> /// Recupera os dados que precisam ser serializados. /// </summary> /// <param name="entityTypeManager"></param> /// <param name="entity"></param> /// <returns></returns> private static IEnumerable <KeyValuePair <string, object> > GetSerializeData(IEntityTypeManager entityTypeManager, IEntity entity) { entity.Require("entity").NotNull(); var type = entity.GetType(); var loader = entityTypeManager.GetLoader(type); var children = loader.GetChildrenAccessors().Where(f => f is IEntityPropertyAccessor).Select(f => (IEntityPropertyAccessor)f).ToArray(); var links = loader.GetLinksAccessors().Where(f => f is IEntityPropertyAccessor).Select(f => (IEntityPropertyAccessor)f).ToArray(); var references = loader.GetReferences().Where(f => f is IEntityPropertyAccessor).Select(f => (IEntityPropertyAccessor)f).ToArray(); foreach (var prop in type.GetProperties()) { if (prop.CanRead && prop.GetIndexParameters().Length == 0 && !prop.GetCustomAttributes(true).Any(f => f is System.Xml.Serialization.XmlIgnoreAttribute) && !children.Any(f => f.PropertyName == prop.Name) && !links.Any(f => f.PropertyName == prop.Name) && !references.Any(f => f.PropertyName == prop.Name)) { object value = null; try { value = prop.GetValue(entity, null); } catch (System.Reflection.TargetInvocationException ex) { throw ex.InnerException; } yield return(new KeyValuePair <string, object>(prop.Name, value)); } } foreach (var i in children.Concat(links).Concat(references)) { yield return(new KeyValuePair <string, object>(i.PropertyName, i.Get(entity))); } }
internal void CreateQueries(Colosoft.Query.Queryable queryable, string parentUidProperty, string uiContext, IEntityTypeManager entityTypeManager, Queue <Exception> exceptions, EntityLoaderExecuteQueryHandler callBack, Colosoft.Query.SubQueryFailedCallBack failedCallBack) { var loader = entityTypeManager.GetLoader(LinkEntityType); var result = new List <EntityLoaderCreatorArgs>(); var query = queryable.BeginSubQuery((sender, e) => { var bindStrategy = loader.GetBindStrategy(); var objectCreator = loader.GetObjectCreator(); var recordKeyFactory = loader.GetRecordKeyFactory(); var dataModelTypeName = Colosoft.Reflection.TypeName.Get(loader.DataModelType); result.Clear(); foreach (var record in e.Result) { var data = objectCreator.Create(); if (!bindStrategy.Bind(record, Query.BindStrategyMode.All, ref data).Any()) { throw new Exception(string.Format("Not found scheme for bind record data to type '{0}'", data.GetType().FullName)); } var recordKey = recordKeyFactory.Create(dataModelTypeName, record); result.Add(new EntityLoaderCreatorArgs((Data.IModel)data, recordKey, new EntityLoaderChildContainer(), new EntityLoaderLinksContainer(), new EntityLoaderReferenceContainer(), uiContext, entityTypeManager)); } var entities = new List <IEntity>(); foreach (var i in result) { IEntity entity = null; LazyDataState lazyDataState = new LazyDataState(); loader.GetLazyData(i, lazyDataState, queryable.SourceContext, uiContext, entityTypeManager, exceptions); entity = loader.Create(uiContext, entityTypeManager, i, queryable.SourceContext); lazyDataState.Entity = entity; entities.Add(entity); i.Dispose(); } var entitiesEnumerable = entities; callBack(this, new EntityLoaderExecuteQueryEventArgs(LinkDataModelType, LinkEntityType, e.ReferenceValues, entitiesEnumerable)); }, failedCallBack).From(new Query.EntityInfo(LinkDataModelType.FullName, "t1")); query.Join(ChildDataModelType.FullName, Query.JoinType.Inner, Query.ConditionalContainer.Parse(string.Format("t1.{0} == t2.{1}", ChildPropertyName, ForeignPropertyName)), "t2"); query.Where(string.Format("t2.{0} == ?parentUid", parentUidProperty)); query.Add("?parentUid", new Query.ReferenceParameter(parentUidProperty)); loader.CreateNestedQueries(query, uiContext, entityTypeManager, result, exceptions); query.EndSubQuery(); }
internal void CreateQueries(Colosoft.Query.Queryable queryable, string uiContext, IEntityLoader parentLoader, IEntityTypeManager entityTypeManager, Queue <Exception> exceptions, EntityLoaderExecuteQueryHandler callBack, Colosoft.Query.SubQueryFailedCallBack failedCallBack) { if (_entityLoader == null) { _entityLoader = entityTypeManager.GetLoader(EntityType); } var result = new List <EntityLoaderCreatorArgs>(); var query = queryable.BeginSubQuery((sender, e) => { List <IEntity> entities = null; try { var bindStrategy = _entityLoader.GetBindStrategy(); var objectCreator = _entityLoader.GetObjectCreator(); var recordKeyFactory = _entityLoader.GetRecordKeyFactory(); var dataModelTypeName = Colosoft.Reflection.TypeName.Get(_entityLoader.DataModelType); result.Clear(); foreach (var record in e.Result) { var data = objectCreator.Create(); if (!bindStrategy.Bind(record, Query.BindStrategyMode.All, ref data).Any()) { throw new Exception(string.Format("Not found scheme for bind record data to type '{0}'", data.GetType().FullName)); } var recordKey = recordKeyFactory.Create(dataModelTypeName, record); result.Add(new EntityLoaderCreatorArgs((Data.IModel)data, recordKey, new EntityLoaderChildContainer(), new EntityLoaderLinksContainer(), new EntityLoaderReferenceContainer(), uiContext, entityTypeManager)); } entities = new List <IEntity>(); foreach (var i in result) { IEntity entity = null; LazyDataState lazyDataState = new LazyDataState(); _entityLoader.GetLazyData(i, lazyDataState, queryable.SourceContext, uiContext, entityTypeManager, exceptions); entity = _entityLoader.Create(uiContext, entityTypeManager, i, queryable.SourceContext); lazyDataState.Entity = entity; entities.Add(entity); i.Dispose(); } } catch (Exception ex) { failedCallBack(sender, new Query.SubQueryCallBackFailedArgs(e.Info, new Query.QueryFailedInfo(Query.QueryFailedReason.Error, ex.Message.GetFormatter(), ex))); return; } callBack(this, new EntityLoaderExecuteQueryEventArgs(DataModelType, EntityType, e.ReferenceValues, entities)); }, failedCallBack).From(new Query.EntityInfo(DataModelType.FullName)); if (ExecutePredicate != null) { query.ExecutePredicate = (Colosoft.Query.QueryExecutePredicate)ExecutePredicate.Clone(); } string conditionalExpression = null; if (parentLoader.HasUid) { query.Add("?parentUid", new Query.ReferenceParameter(parentLoader.UidPropertyName)); conditionalExpression = string.Format("{0} == ?parentUid", _foreignPropertyName); } if (Conditional != null) { if (!string.IsNullOrEmpty(conditionalExpression)) { conditionalExpression = string.Format("{0} && ({1})", conditionalExpression, this.Conditional.Expression); } else { conditionalExpression = this.Conditional.Expression; } foreach (var i in this.Conditional.Parameters) { query.Add(i.Name, i.Value); } } if (string.IsNullOrEmpty(conditionalExpression)) { throw new InvalidOperationException("Not support child, because not found conditional expression."); } query.Where(conditionalExpression); if (_entityLoader != parentLoader) { _entityLoader.CreateNestedQueries(query, uiContext, entityTypeManager, result, exceptions); } query.EndSubQuery(); }
internal void CreateQueries(Colosoft.Query.Queryable queryable, string uiContext, IEntityTypeManager entityTypeManager, Queue <Exception> exceptions, EntityLoaderExecuteQueryHandler callBack, Colosoft.Query.SubQueryFailedCallBack failedCallBack) { if (_entityLoader == null) { _entityLoader = entityTypeManager.GetLoader(EntityType); } var result = new List <EntityLoaderCreatorArgs>(); var query = queryable.BeginSubQuery((sender, e) => { List <IEntity> entities = null; try { var bindStrategy = _entityLoader.GetBindStrategy(); var objectCreator = _entityLoader.GetObjectCreator(); var recordKeyFactory = _entityLoader.GetRecordKeyFactory(); Colosoft.Reflection.TypeName dataModelTypeName = null; try { dataModelTypeName = Colosoft.Reflection.TypeName.Get(_entityLoader.DataModelType); } catch (Exception ex) { throw new Exception("An error ocurred when get DataModelType", ex); } result.Clear(); foreach (var record in e.Result) { var data = objectCreator.Create(); var bindResult = bindStrategy.Bind(record, Query.BindStrategyMode.All, ref data); if (!bindResult.Any()) { throw new Exception(string.Format("Not found scheme for bind record data to type '{0}'", data.GetType().FullName)); } Query.RecordKey recordKey = null; try { recordKey = recordKeyFactory.Create(dataModelTypeName, record); } catch (Exception ex) { throw new Exception("An error ocurred when create record key", ex); } result.Add(new EntityLoaderCreatorArgs((Data.IModel)data, recordKey, new EntityLoaderChildContainer(), new EntityLoaderLinksContainer(), new EntityLoaderReferenceContainer(), uiContext, entityTypeManager)); } entities = new List <IEntity>(); foreach (var i in result) { try { IEntity entity = null; LazyDataState lazyDataState = new LazyDataState(); _entityLoader.GetLazyData(i, lazyDataState, queryable.SourceContext, uiContext, entityTypeManager, exceptions); entity = _entityLoader.Create(uiContext, entityTypeManager, i, queryable.SourceContext); lazyDataState.Entity = entity; entities.Add(entity); i.Dispose(); } catch (Exception ex) { throw new AggregateException(ex.Message, exceptions); } } } catch (Exception ex) { failedCallBack(sender, new Query.SubQueryCallBackFailedArgs(e.Info, new Query.QueryFailedInfo(Query.QueryFailedReason.Error, ex.Message.GetFormatter(), ex))); return; } callBack(this, new EntityLoaderExecuteQueryEventArgs(DataModelType, EntityType, e.ReferenceValues, entities)); entities.Clear(); }, failedCallBack).From(new Query.EntityInfo(DataModelType.FullName)); var conditional = this.GetConditional(); if (conditional == null) { throw new InvalidOperationException("Conditional not found"); } query.Where(conditional.Expression); foreach (var i in conditional.Parameters) { query.Add(i.Name, i.Value); } _entityLoader.CreateNestedQueries(query, uiContext, entityTypeManager, result, exceptions); query.EndSubQuery(); }