Пример #1
0
        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();
        }
        /// <summary>
        /// Cria as consulta para recupera os itens filhos.
        /// </summary>
        /// <param name="queryable">Consulta do item pai.</param>
        /// <param name="uiContext">Contexto visual.</param>
        /// <param name="exceptions">Fila do erros ocorridos.</param>
        /// <param name="entityTypeManager">Instancia do gereciador de tipos da entidade de negócio.</param>
        /// <param name="callBack"></param>
        /// <param name="failedCallBack"></param>
        /// <returns></returns>
        public void CreateQueries(Colosoft.Query.Queryable queryable, string uiContext, IEntityTypeManager entityTypeManager, Queue <Exception> exceptions, EntityLoaderExecuteQueryHandler callBack, Colosoft.Query.SubQueryFailedCallBack failedCallBack)
        {
            IEnumerable <IEntity> entities = null;
            var entriesCount         = _dynamicChild.Entries.Count;
            var dynamicChildPosition = 0;

            for (var i = 0; i < _dynamicChild.Entries.Count; i++)
            {
                var entry = _dynamicChild.Entries[i];
                entry.CreateQueries(queryable, uiContext, _parentLoader, entityTypeManager, exceptions, (sender, e) => {
                    if (dynamicChildPosition == 0)
                    {
                        entities = e.Result;
                    }
                    else
                    {
                        entities = entities.Concat(e.Result);
                    }
                    if (++dynamicChildPosition == entriesCount)
                    {
                        dynamicChildPosition = 0;
                        IEnumerable <IEntity> entitiesEnumerable = entities ?? new IEntity[0];
                        callBack(this, new EntityLoaderExecuteQueryEventArgs(DataModelType, EntityType, new Query.ReferenceParameterValueCollection(), entitiesEnumerable));
                        entities = null;
                    }
                }, (sender, e) => {
                    failedCallBack(this, e);
                });
            }
            if (entriesCount == 0)
            {
                queryable.NestedQueriesProcessed += (sender, e) => {
                    for (var i = 0; i < e.RecordsCount; i++)
                    {
                        IEnumerable <IEntity> entitiesEnumerable = new IEntity[0];
                        callBack(this, new EntityLoaderExecuteQueryEventArgs(DataModelType, EntityType, new Query.ReferenceParameterValueCollection(), entitiesEnumerable));
                    }
                };
            }
        }
Пример #3
0
        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();
        }
Пример #4
0
        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();
        }