예제 #1
0
        /// <summary>
        ///     Creates a regular <see cref="FlowQuerySelection{TDestination}" /> instance.
        /// </summary>
        /// <param name="query">
        ///     The query.
        /// </param>
        /// <typeparam name="TSource">
        ///     The <see cref="System.Type" /> of the source entity.
        /// </typeparam>
        /// <typeparam name="TDestination">
        ///     The <see cref="System.Type" /> of the result.
        /// </typeparam>
        /// <returns>
        ///     The created <see cref="FlowQuerySelection{TDestination}" /> instance.
        /// </returns>
        public static FlowQuerySelection <TDestination> SelectList <TSource, TDestination>(IQueryableFlowQuery query)
            where TSource : class
        {
            ICriteriaBuilder criteriaBuilder = GetCriteriaBuilder(query);

            ICriteria criteria = criteriaBuilder.Build <TSource, TDestination>(query);

            if (query.Constructor != null)
            {
                IEnumerable enumerable = query.IsDelayed
                    ? criteria.Future <object>()
                    : (IEnumerable)criteria.List();

                return(new FlowQuerySelection <TDestination>
                       (
                           () => ConstructionHelper.GetListByExpression <TDestination>(query.Constructor, enumerable)
                       ));
            }

            IEnumerable <TDestination> selection = query.IsDelayed
                ? criteria.Future <TDestination>()
                : criteria.List <TDestination>();

            // ReSharper disable once PossibleMultipleEnumeration
            return(new FlowQuerySelection <TDestination>(() => selection));
        }
예제 #2
0
        public QueryResult Result <T>(string queryString)
        {
            var       hasInline  = HasInlineCount(queryString);
            ICriteria query      = Criteria <T>(queryString);
            ICriteria countQuery = (ICriteria)query.Clone();

            var list = query.Future <T>();

            QueryResult result;

            if (hasInline)
            {
                countQuery.ClearOrders();
                var count = countQuery
                            .SetFirstResult(0)
                            .SetMaxResults(Int32.MaxValue)
                            .SetProjection(Projections.RowCount()).FutureValue <Int32>();

                result = new QueryResult()
                {
                    InlineCount = count.Value, Results = list
                };
            }
            else
            {
                result = new QueryResult()
                {
                    Results = list
                };
            }
            return(result);
        }
예제 #3
0
        /// <summary>
        ///     Versuch über ein Detached Criteria die Where-Klauseln zu verarbeiten, damit es mit dem Order nicht zu
        ///     komplikationen kommt.
        /// </summary>
        protected virtual IPage <T> Find(IPageable pageable, Action <DetachedCriteria> criteriaBuilder, Action <ICriteria> ordersBuilder = null)
        {
            Require.NotNull(pageable, "pageable");
            Require.NotNull(criteriaBuilder, "criteriaBuilder");

            HibernateDelegate <IPage <T> > finder = delegate(ISession session) {
                DetachedCriteria whereCriteria = DetachedCriteria.For(typeof(T));
                criteriaBuilder(whereCriteria);
                whereCriteria.SetProjection(Projections.Property("Id"));

                ICriteria elementsCriteria = session.CreateCriteria(typeof(T));
                elementsCriteria.Add(Subqueries.PropertyIn("Id", whereCriteria));

                if (ordersBuilder != null)
                {
                    ordersBuilder(elementsCriteria);
                }
                ApplyPaging(pageable, elementsCriteria);

                ICriteria countCriteria = session.CreateCriteria(typeof(T));
                countCriteria.Add(Subqueries.PropertyIn("Id", whereCriteria));
                countCriteria.SetProjection(Projections.RowCountInt64());

                IFutureValue <long> futureTotalCount = countCriteria.FutureValue <long>();
                IEnumerable <T>     futureElements   = elementsCriteria.Future <T>();
                Page <T>            page             = new Page <T>(futureElements.ToList(), pageable, futureTotalCount.Value);
                return(page);
            };

            return(HibernateTemplate.Execute(finder));
        }
예제 #4
0
        public static DataPage <T> DataPage <T>(this ICriteria criteria, Pager pager) where T : class
        {
            if (pager.UsePages)
            {
                criteria.SetPage(pager.Start, pager.MaxResults);
            }
            else
            {
                criteria
                .SetFirstResult(pager.Start)
                .SetMaxResults(pager.MaxResults);
            }
            pager.Sorts.Each(x => criteria.AddOrder(x));

            var count = criteria
                        .RowCount()
                        .FutureValue <int>();

            var list = criteria.Future <T>();

            return(new DataPage <T> {
                TotalCount = count.Value,
                Data = list.ToArray()
            });
        }
예제 #5
0
 private void CreateCriteriaOrFutures()
 {
     _mainCriteria = _session.CreateCriteria <T>().Add(Restrictions.In(_session.SessionFactory.GetClassMetadata(typeof(T)).IdentifierPropertyName, _ids)).SetTimeout(_timeoutInSeconds);
     if (_childNodesInfo != null)
     {
         bool rootHasList    = false; //only one list can be joined with the main query
         var  childCriterias = new List <ICriteria>();
         PopulateChildrenCriteria(_childNodesInfo, CriteriaTransformer.Clone(_mainCriteria), _mainCriteria, ref rootHasList, childCriterias);
         if (childCriterias.Count > 0 || _deferred)
         {
             _mainFuture   = _mainCriteria.Future <T>();
             _childFutures = childCriterias.Select(c => c.Future <T>()).ToList();
         }
     }
     else if (_deferred)
     {
         _mainFuture = _mainCriteria.Future <T>();
     }
 }
예제 #6
0
        public IEnumerable <NewsData> SearchByUser(object userId)
        {
            ArgumentValidator.IsNotNull("userId", userId);

            IEnumerable <NewsData> result = null;

            RepositoryExceptionWrapper.Wrap(GetType(), () =>
            {
                ICriteria query = CurrentSession.CreateCriteria <NewsData>();
                query.AddExpressionEq <NewsData, object>(o => o.IssuedById, userId);

                result = query.Future <NewsData>();
            });

            return(result);
        }
예제 #7
0
        public IEnumerable <ContactData> SearchByEmployee(object employeeId)
        {
            ArgumentValidator.IsNotNull("EmployeeId", employeeId);

            IEnumerable <ContactData> result = null;

            RepositoryExceptionWrapper.Wrap(GetType(), () =>
            {
                ICriteria query = CurrentSession.CreateCriteria <ContactData>();
                query.AddExpressionEq <ContactData, object>(o => o.EmployeeId, employeeId);

                result = query.Future <ContactData>();
            });

            return(result);
        }
        public IEnumerable <OpportunityData> SearchByCustomer(object customerId)
        {
            ArgumentValidator.IsNotNull("customerId", customerId);

            IEnumerable <OpportunityData> result = null;

            RepositoryExceptionWrapper.Wrap(GetType(), () =>
            {
                ICriteria query = CurrentSession.CreateCriteria <OpportunityData>();
                query.AddExpressionEq <OpportunityData, object>(o => o.CustomerId, customerId);

                result = query.Future <OpportunityData>();
            });

            return(result);
        }
        public IEnumerable <DataPhraseData> SearchByLanguage(object languageId)
        {
            ArgumentValidator.IsNotNull("languageId", languageId);

            IEnumerable <DataPhraseData> result = null;

            RepositoryExceptionWrapper.Wrap(GetType(), () =>
            {
                ICriteria query = CurrentSession.CreateCriteria <DataPhraseData>();
                query.AddExpressionEq <DataPhraseData, object>(o => o.LanguageId, languageId);

                result = query.Future <DataPhraseData>();
            });

            return(result);
        }
예제 #10
0
        public IEnumerable <ProductData> SearchBySupplier(object supplierId)
        {
            ArgumentValidator.IsNotNull("SupplierId", supplierId);

            IEnumerable <ProductData> result = null;

            RepositoryExceptionWrapper.Wrap(GetType(), () =>
            {
                ICriteria query = CurrentSession.CreateCriteria <ProductData>();
                query.AddExpressionEq <ProductData, object>(o => o.SupplierId, supplierId);

                result = query.Future <ProductData>();
            });

            return(result);
        }
예제 #11
0
        public IEnumerable <CategoryData> RetrieveCategoryTree(object catalogId)
        {
            ArgumentValidator.IsNotNull("catalogId", catalogId);

            IEnumerable <CategoryData> result = null;

            RepositoryExceptionWrapper.Wrap(GetType(), () =>
            {
                ICriteria query = CurrentSession.CreateCriteria <CategoryData>();
                query.AddExpressionEq <CategoryData, object>(o => o.CatalogId, catalogId);

                result = query.Future <CategoryData>();
            });

            return(result);
        }
예제 #12
0
        public IEnumerable <ReviewData> SearchByReference(object id)
        {
            ArgumentValidator.IsNotNull("id", id);

            IEnumerable <ReviewData> result = null;

            RepositoryExceptionWrapper.Wrap(GetType(), () =>
            {
                ICriteria query = CurrentSession.CreateCriteria <ReviewData>();
                query.AddExpressionEq <ReviewData, object>(o => o.ReferenceId, id);

                result = query.Future <ReviewData>();
            });

            return(result);
        }
예제 #13
0
        /// <summary>
        ///     Liefert eine Liste mit Entities entsprechend der Pageinformationen
        ///     aus der Menge aller Entitäten.
        /// </summary>
        /// <param name="pageable">Beschreibung welche Menge der Entitäten zurückgeliefert werden.</param>
        /// <returns>Liste mit Entitäten.</returns>
        public virtual IPage <T> GetAll(IPageable pageable)
        {
            Require.NotNull(pageable, "pageable");

            HibernateDelegate <IPage <T> > finder = delegate(ISession session) {
                ICriteria elementsCriteria = session.CreateCriteria(typeof(T));
                elementsCriteria.AddOrder(Order.Asc("Id"));
                ApplyPaging(pageable, elementsCriteria);

                ICriteria countCriteria = session.CreateCriteria(typeof(T));
                countCriteria.SetProjection(Projections.RowCountInt64());

                IFutureValue <long> futureTotalCount = countCriteria.FutureValue <long>();
                IEnumerable <T>     futureElements   = elementsCriteria.Future <T>();
                Page <T>            page             = new Page <T>(futureElements.ToList(), pageable, futureTotalCount.Value);
                return(page);
            };

            return(HibernateTemplate.Execute(finder));
        }