public static Collections.VirtualList <TEntity> ToVirtualResult <TEntity>(this Colosoft.Query.Queryable queryable, int pageSize, string countExpression = null, string uiContext = null, Colosoft.Query.IQueryResultBindStrategy bindStrategy = null, Colosoft.Query.IQueryResultObjectCreator objectCreator = null) where TEntity : class
        {
            queryable.Require("queryable").NotNull();
            Collections.VirtualListLoader <TEntity>           virtualListLoader = null;
            Colosoft.Query.QueryableExecuterHandler <TEntity> executeSelect     = null;
            Collections.VirtualList <TEntity> result = null;
            if (bindStrategy == null && objectCreator == null)
            {
                var ts = Colosoft.Query.TypeBindStrategyCache.GetItem(typeof(TEntity), t => new Colosoft.Query.QueryResultObjectCreator(t));
                objectCreator = ts;
                bindStrategy  = ts;
            }
            if (bindStrategy == null)
            {
                bindStrategy = new Colosoft.Query.TypeBindStrategy(typeof(TEntity), objectCreator);
            }
            var queryable2 = (Colosoft.Query.Queryable)queryable.Clone();

            if (typeof(Colosoft.Business.IEntity).IsAssignableFrom(typeof(TEntity)))
            {
                virtualListLoader = Colosoft.Business.EntityManager.Instance.GetEntityVirtualListLoader <TEntity>(queryable2, countExpression, false, uiContext, null);
                executeSelect     = (queryable3, dataSource, bindStrategy1, objectCreator1) => queryable3.ExecuteSelectProcessResult <TEntity>(uiContext, bindStrategy1, objectCreator1);
            }
            else
            {
                virtualListLoader = new Colosoft.Business.QueryableVirtualListLoader <TEntity>(queryable2, countExpression, bindStrategy, objectCreator, null);
            }
            result = new Business.QueryableVirtualList <TEntity>(queryable2, pageSize, virtualListLoader, executeSelect, null, bindStrategy, objectCreator);
            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Cria um nova consulta.
        /// </summary>
        /// <returns></returns>
        public Colosoft.Query.Queryable CreateQuery()
        {
            var query = new Colosoft.Query.Queryable();

            query.DataSource = _dataSource;
            return(query);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Prepara as consultas aninhadas para a consulta informada.
        /// </summary>
        /// <param name="queryable">Consulta que será usada para recuperar a entidade.</param>
        /// <param name="uiContext">Contexto visual;</param>
        /// <param name="entityTypeManager">Instancia do gerenciador de tipos de entidades.</param>
        /// <returns>Dados da preparação.</returns>
        public virtual PrepareNestedQueriesResult PrepareNestedQueries(Colosoft.Query.Queryable queryable, string uiContext, IEntityTypeManager entityTypeManager)
        {
            var parentResult = new List <EntityLoaderCreatorArgs>();
            var exceptions   = new Queue <Exception>();

            CreateNestedQueries(queryable, uiContext, entityTypeManager, parentResult, exceptions);
            return(new PrepareNestedQueriesResult(queryable, this, uiContext, entityTypeManager, parentResult, exceptions));
        }
 /// <summary>
 /// Processa o resultado da consulta a carrega as entidades de negócio.
 /// </summary>
 /// <typeparam name="TEntity">Tipo da entidade de negócio.</typeparam>
 /// <param name="queryable">Consulta.</param>
 /// <param name="uiContext"></param>
 /// <returns></returns>
 public static IEnumerable <TEntity> ProcessLazyResult <TEntity>(this Colosoft.Query.Queryable queryable, string uiContext = null) where TEntity : class, Colosoft.Business.IEntity
 {
     queryable.Require("queryable").NotNull();
     if (Colosoft.Business.EntityManager.Instance == null)
     {
         throw new InvalidOperationException("EntityManager instance is null");
     }
     return(Colosoft.Business.EntityManager.Instance.ProcessLazyResult <TEntity>(queryable, queryable.SourceContext, uiContext));
 }
 /// <summary>
 /// Cria a instancia com o suporte para estratégia de vinculação.
 /// </summary>
 /// <param name="entityTypeManager">Gerenciador dos tipos de entidades.</param>
 /// <param name="entityLoader">Loader da entidade.</param>
 /// <param name="queryable"></param>
 /// <param name="countExpression"></param>
 /// <param name="isLazy">Identifica se é para fazer uma carga tardia.</param>
 /// <param name="castHandler">Instancia do manipulador que vai realizar o cast do item do resultado.</param>
 /// <param name="uiContext">Contexto de interface com o usuário.</param>
 public QueryableEntityVirtualListLoader(IEntityTypeManager entityTypeManager, IEntityLoader entityLoader, Colosoft.Query.Queryable queryable, string countExpression, bool isLazy, Func <object, TEntity> castHandler, string uiContext)
 {
     _entityTypeManager = entityTypeManager;
     _entityLoader      = entityLoader;
     _queryable         = queryable;
     _countExpression   = countExpression;
     _isLazy            = isLazy;
     _uiContext         = uiContext;
     _castHandler       = castHandler;
 }
Ejemplo n.º 6
0
 /// <summary>
 /// Cria a instancia a partir de uma consulta.
 /// </summary>
 /// <param name="queryable"></param>
 /// <param name="bindStrategy">Estratégia de vinculação.</param>
 /// <param name="objectCreator">Criador de objetos.</param>
 /// <param name="executeSelect">Referencia do método que será usado para executar a seleção dos dados.</param>
 public Queryable(Query.Queryable queryable, IQueryResultBindStrategy bindStrategy, IQueryResultObjectCreator objectCreator, Func <Query.Queryable, IEnumerable <TEntity> > executeSelect)
 {
     queryable.Require("queryable").NotNull();
     _sourceContext = queryable.SourceContext as ILinqSourceContext;
     _queryable     = queryable;
     if (_sourceContext == null)
     {
         _sourceContext = new LinqSourceContext(queryable.SourceContext, new QueryableSourceProvider <TEntity>(queryable, bindStrategy, objectCreator, executeSelect));
     }
     _queryProvider = new QueryProvider(_sourceContext);
 }
Ejemplo n.º 7
0
 /// <summary>
 /// Executa a primeira consulta para recuperar o quantidade de registro
 /// da lista.
 /// </summary>
 /// <param name="query">Consulta de deve ser executada.</param>
 /// <returns></returns>
 protected virtual int ExecuteCount(Colosoft.Query.Queryable query)
 {
     using (var enumerator = query.Execute().GetEnumerator())
     {
         if (enumerator.MoveNext())
         {
             return(enumerator.Current.GetInt32(0));
         }
         return(0);
     }
 }
        public static Collections.VirtualList <TEntity> ToVirtualResult <TEntity>(this Colosoft.Query.Queryable queryable, int pageSize, Collections.VirtualListLoader <TEntity> listLoader, Colosoft.Query.IQueryResultBindStrategy bindStrategy = null, Colosoft.Query.IQueryResultObjectCreator objectCreator = null) where TEntity : class
        {
            listLoader.Require("listLoader").NotNull();
            queryable.Require("queryable").NotNull();
            var queryable2 = (Colosoft.Query.Queryable)queryable.Clone();

            Colosoft.Query.QueryableExecuterHandler <TEntity> executeSelect = null;
            if (typeof(Colosoft.Business.IEntity).IsAssignableFrom(typeof(TEntity)))
            {
                executeSelect = (queryable3, dataSource, bindStrategy1, objectCreator1) => queryable3.ExecuteSelectProcessResult <TEntity>(null, bindStrategy1, objectCreator1);
            }
            return(new Business.QueryableVirtualList <TEntity>(queryable2, pageSize, listLoader, executeSelect, null, bindStrategy, objectCreator));
        }
Ejemplo n.º 9
0
 /// <summary>
 /// Cria a instancia a partir de uma consulta.
 /// </summary>
 /// <param name="queryable"></param>
 /// <param name="elementType"></param>
 /// <param name="executeSelect">Referencia do método que será usado para executar a seleção dos dados.</param>
 public CustomQueryable(Query.Queryable queryable, Type elementType, Func <Query.Queryable, System.Collections.IEnumerable> executeSelect)
 {
     queryable.Require("queryable").NotNull();
     elementType.Require("elementType").NotNull();
     _elementType   = elementType;
     _sourceContext = queryable.SourceContext as ILinqSourceContext;
     _queryable     = queryable;
     if (_sourceContext == null)
     {
         _sourceContext = new LinqSourceContext(queryable.SourceContext, new QueryableSourceProvider(queryable, executeSelect));
     }
     _queryProvider = new QueryProvider(_sourceContext);
 }
Ejemplo n.º 10
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="queryable">Consulta associada.</param>
 /// <param name="pageSize"></param>
 /// <param name="loader"></param>
 /// <param name="executeSelect">Referencia do método que será usado para executar a seleção dos dados.</param>
 /// <param name="referenceObject"></param>
 /// <param name="bindStrategy"></param>
 /// <param name="objectCreator"></param>
 public QueryableVirtualList(Colosoft.Query.Queryable queryable, int pageSize, VirtualListLoader <T> loader, Colosoft.Query.QueryableExecuterHandler <T> executeSelect, object referenceObject, Colosoft.Query.IQueryResultBindStrategy bindStrategy, Colosoft.Query.IQueryResultObjectCreator objectCreator) : base(pageSize, loader, referenceObject)
 {
     _queryable     = queryable;
     _executeSelect = executeSelect;
     _bindStrategy  = bindStrategy;
     _objectCreator = objectCreator;
     if (_bindStrategy == null && _objectCreator == null)
     {
         var ts = Colosoft.Query.TypeBindStrategyCache.GetItem(typeof(T), t => new Colosoft.Query.QueryResultObjectCreator(t));
         _objectCreator = ts;
         _bindStrategy  = ts;
     }
     if (_bindStrategy == null)
     {
         _bindStrategy = new Colosoft.Query.TypeBindStrategy(typeof(T), objectCreator);
     }
 }
Ejemplo n.º 11
0
        /// <summary>
        /// Realiza a carga da entidade com carga tardia dos dados filhos.
        /// </summary>
        /// <param name="query">Instancia da consulta para recuperar a entidade.</param>
        /// <param name="sourceContext">Contexto de origem dos dados.</param>
        /// <param name="uiContext">Contexto visual.</param>
        /// <param name="args">Argumentos que serão usados</param>
        /// <param name="entityTypeManager">Instancia do gerenciador de tipos de entidades.</param>
        /// <returns></returns>
        public virtual IEntity LazyLoad(Colosoft.Query.Queryable query, Colosoft.Query.ISourceContext sourceContext, string uiContext, IEntityTypeManager entityTypeManager, EntityLoaderLazyArgs args = null)
        {
            var result     = query.Take(1).Execute();
            var enumerator = result.GetEnumerator();

            if (enumerator.MoveNext())
            {
                var record        = enumerator.Current;
                var bindStrategy  = GetBindStrategy();
                var objectCreator = GetObjectCreator();
                var recordKey     = GetRecordKeyFactory().Create(Colosoft.Reflection.TypeName.Get(DataModelType), record);
                return(LazyLoad(record, recordKey, bindStrategy, objectCreator, sourceContext, uiContext, entityTypeManager));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Realiza a carga completa da entidade.
        /// </summary>
        /// <param name="query">Instancia da consulta para recuperar a entidade.</param>
        /// <param name="sourceContext">Contexto de origem dos dados.</param>
        /// <param name="uiContext">Contexto visual.</param>
        /// <param name="entityTypeManager">Gerenciador de tipos.</param>
        /// <returns></returns>
        public virtual IEntity FullLoad(Colosoft.Query.Queryable query, Colosoft.Query.ISourceContext sourceContext, string uiContext, IEntityTypeManager entityTypeManager)
        {
            var result     = query.Take(1).Execute();
            var enumerator = result.GetEnumerator();

            if (enumerator.MoveNext())
            {
                var record = enumerator.Current;
                var bindStrategySession = GetBindStrategy().CreateSession(record.Descriptor);
                var objectCreator       = GetObjectCreator();
                var recordKeyFactory    = GetRecordKeyFactory();
                var dataModelTypeName   = Colosoft.Reflection.TypeName.Get(DataModelType);
                var recordKey           = recordKeyFactory.Create(dataModelTypeName, record);
                return(FullLoad(record, recordKey, bindStrategySession, objectCreator, sourceContext, uiContext, entityTypeManager));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 13
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));
                    }
                };
            }
        }
Ejemplo n.º 15
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="dataModelType">Tipo do modelo de dados.</param>
 /// <param name="entityType">Tipo da entidade do resultado.</param>
 /// <param name="query">Consulta.</param>
 public EntityInfoQuery(Type dataModelType, Type entityType, Colosoft.Query.Queryable query)
 {
     this.DataModelType = dataModelType;
     this.EntityType    = entityType;
     this.Query         = query;
 }
 /// <summary>
 /// Executa a primeira consulta para recuperar o quantidade de registro
 /// da lista.
 /// </summary>
 /// <param name="query">Consulta de deve ser executada.</param>
 /// <returns></returns>
 protected virtual int ExecuteCount(Colosoft.Query.Queryable query)
 {
     return(query.Execute().First().GetInt32(0));
 }
Ejemplo n.º 17
0
 /// <summary>
 /// Cria a instancia com o suporte para estratégia de vinculação.
 /// </summary>
 /// <param name="queryable"></param>
 /// <param name="countExpression"></param>
 /// <param name="bindStrategy"></param>
 /// <param name="objectCreator"></param>
 /// <param name="castHandler">Instancia do manipulador que vai realizar o cast do item do resultado.</param>
 public QueryableVirtualListLoader(Colosoft.Query.Queryable queryable, string countExpression, Colosoft.Query.IQueryResultBindStrategy bindStrategy, Colosoft.Query.IQueryResultObjectCreator objectCreator, Func <object, T> castHandler) : this(queryable, countExpression)
 {
     _bindStrategy  = bindStrategy;
     _objectCreator = objectCreator;
     _castHandler   = castHandler;
 }
Ejemplo n.º 18
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="queryable"></param>
 /// <param name="countExpression"></param>
 public QueryableVirtualListLoader(Colosoft.Query.Queryable queryable, string countExpression)
 {
     _queryable       = queryable;
     _countExpression = countExpression;
 }
Ejemplo n.º 19
0
        public static Collections.VirtualList <TProxy> ToProxyVirtualResult <TEntity, TProxy>(this Colosoft.Query.Queryable queryable, int pageSize = 0, string countExpression = null, Func <TEntity, TProxy> proxyCreator = null) where TEntity : new()
        {
            queryable.Require("queryable").NotNull();
            var queryable2    = (Colosoft.Query.Queryable)queryable.Clone();
            var bindStrategy  = Colosoft.Query.TypeBindStrategyCache.GetItem(typeof(TEntity), f => new Colosoft.Query.QueryResultObjectCreator(() => new TEntity()));
            var objectCreator = bindStrategy;

            return(new Business.QueryableVirtualList <TProxy>(queryable2, pageSize, new Colosoft.Business.QueryableVirtualListLoader <TProxy>(queryable2, countExpression, bindStrategy, bindStrategy, proxyCreator != null ? new Func <object, TProxy>(f => proxyCreator((TEntity)f)) : null), null, null, bindStrategy, objectCreator));
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Recuper o Loader da lista virtual para a entidade do tipo informado.
        /// </summary>
        /// <param name="queryable">Consulta.</param>
        /// <param name="countExpression">Expressão para a consulta Count.</param>
        /// <param name="isLazy">Identifica se é para carregar com lazy.</param>
        /// <param name="uiContext">Contexto de interface com o usuário.</param>
        /// <param name="castHandler">Instancia do manipulador que vai realizar o cast do item do resultado.</param>
        /// <returns></returns>
        public Colosoft.Collections.VirtualListLoader <TEntity> GetEntityVirtualListLoader <TEntity>(Colosoft.Query.Queryable queryable, string countExpression, bool isLazy, string uiContext, Func <object, TEntity> castHandler) where TEntity : class
        {
            var loaderType = typeof(Business.QueryableEntityVirtualListLoader <>).MakeGenericType(typeof(TEntity));
            var parameters = new object[] {
                _entityTypeManager,
                _entityTypeManager.GetLoader(typeof(TEntity)),
                queryable,
                countExpression,
                isLazy,
                castHandler,
                uiContext,
            };

            return((Colosoft.Collections.VirtualListLoader <TEntity>)Activator.CreateInstance(loaderType, parameters));
        }
Ejemplo n.º 21
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();
        }
Ejemplo n.º 22
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();
        }
Ejemplo n.º 23
0
 public static Collections.VirtualList <TEntity> ToVirtualResult <TEntity>(this Colosoft.Query.Queryable queryable, Colosoft.Query.IQueryResultBindStrategy bindStrategy = null, Colosoft.Query.IQueryResultObjectCreator objectCreator = null) where TEntity : class
 {
     return(ToVirtualResult <TEntity>(queryable, 0, null, null, bindStrategy, objectCreator));
 }
Ejemplo n.º 24
0
 /// <summary>
 /// Cria as consultas aninhadas para recupera as referencia da entidade pai.
 /// </summary>
 /// <param name="queryable">Consulta usada para recueprar a entidade.</param>
 /// <param name="uiContext">Contexto visual.</param>
 /// <param name="entityTypeManager">Instancia do gerenciador de tipos de entidades.</param>
 /// <param name="parentResult">Resultados dos itens pai.</param>
 /// <param name="exceptions">Fila dos erros ocorridos.</param>
 public abstract void CreateNestedQueries(Colosoft.Query.Queryable queryable, string uiContext, IEntityTypeManager entityTypeManager, IList <EntityLoaderCreatorArgs> parentResult, Queue <Exception> exceptions);
Ejemplo n.º 25
0
 /// <summary>
 /// Processa a consulta e recupera o resultado como IEntityDescriptors.
 /// </summary>
 /// <typeparam name="TEntity"></typeparam>
 /// <typeparam name="TEntityDescriptor"></typeparam>
 /// <param name="query">Consulta que será utilizada no processamento.</param>
 /// <param name="uiContext"></param>
 /// <returns></returns>
 public static IEnumerable <TEntityDescriptor> ProcessResultDescriptor <TEntity, TEntityDescriptor>(this Colosoft.Query.Queryable query, string uiContext = null) where TEntity : class, Colosoft.Business.IEntity where TEntityDescriptor : IEntityDescriptor
 {
     query.Require("query").NotNull();
     if (Colosoft.Business.EntityManager.Instance == null)
     {
         throw new InvalidOperationException("EntityManager instance is null");
     }
     return(Colosoft.Business.EntityManager.Instance.ProcessResultDescriptor <TEntity, TEntityDescriptor>(query, query.SourceContext, uiContext));
 }
 /// <summary>
 /// Construtor usado para carregar as entidade com base no resultado preparado.
 /// </summary>
 /// <param name="entityLoader">Loader associado.</param>
 /// <param name="queryable"></param>
 /// <param name="sourceContext"></param>
 /// <param name="result"></param>
 /// <param name="uiContext"></param>
 /// <param name="entityTypeManager"></param>
 /// <param name="entityLazyArgs"></param>
 public GetLazyEntitiesEnumerable(EntityLoader <TEntity1, Model> entityLoader, Colosoft.Query.Queryable queryable, Colosoft.Query.ISourceContext sourceContext, IEnumerable <Colosoft.Query.IRecord> result, string uiContext, IEntityTypeManager entityTypeManager, EntityLoaderLazyArgs entityLazyArgs) : base(entityLoader, queryable, sourceContext, uiContext, entityTypeManager)
 {
     _entityLazyArgs = entityLazyArgs;
     _result         = result;
 }