예제 #1
0
        protected async Task <List <TView> > GetListAsync <TView>(Expression <Func <TModel, bool> > predicate, ODataQueryOptions <TModel> queryOptions)
            where TView : ODataViewModelBase <TDbContext, TModel, TView>
        {
            Expression <Func <TModel, bool> > pre = null;

            if (queryOptions.Filter != null)
            {
                ODataHelper <TModel> .ParseFilter(queryOptions.Filter.FilterClause.Expression, ref pre);

                predicate = ODataHelper <TModel> .CombineExpression(predicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
            }

            int?          top     = queryOptions.Top?.Value;
            var           skip    = queryOptions.Skip?.Value ?? 0;
            RequestPaging request = new RequestPaging()
            {
                PageIndex = 0,
                PageSize  = top.HasValue ? top + top * (skip / top + 1) : null,
                OrderBy   = queryOptions.OrderBy?.RawValue
            };
            List <TView> data = null;

            if (data == null)
            {
                if (predicate != null)
                {
                    var getData = await ODataDefaultRepository <TDbContext, TModel, TView> .Instance.GetModelListByAsync(predicate,
                                                                                                                         request.OrderBy, request.Direction, request.PageSize, request.PageIndex, request.Skip, request.Top).ConfigureAwait(false);

                    if (getData.IsSucceed)
                    {
                        //await MixCacheService.SetAsync(cacheKey, getData);
                        data = getData.Data.Items;
                    }
                }
                else
                {
                    var getData = await ODataDefaultRepository <TDbContext, TModel, TView> .Instance.GetModelListAsync(
                        request.OrderBy, request.Direction, request.PageSize, request.PageIndex
                        , null, null).ConfigureAwait(false);

                    if (getData.IsSucceed)
                    {
                        //await MixCacheService.SetAsync(cacheKey, getData);
                        data = getData.Data.Items;
                    }
                }
            }

            return(data);
        }
예제 #2
0
        public static Task <RepositoryResponse <List <AttributeDataViewModel> > > FilterByValueAsync(string culture, string attributeSetName
                                                                                                     , Dictionary <string, Microsoft.Extensions.Primitives.StringValues> queryDictionary
                                                                                                     , MixCmsContext _context = null, IDbContextTransaction _transaction = null)
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                Expression <Func <MixAttributeSetValue, bool> > valPredicate = m => m.Specificulture == culture;
                List <AttributeDataViewModel> result = new List <AttributeDataViewModel>();
                foreach (var q in queryDictionary)
                {
                    Expression <Func <MixAttributeSetValue, bool> > pre = m =>
                                                                          m.Specificulture == culture && m.AttributeSetName == attributeSetName &&
                                                                          m.AttributeFieldName == q.Key && m.StringValue.Contains(q.Value);
                    valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                }
                var query = context.MixAttributeSetValue.Where(valPredicate);
                var data  = context.MixAttributeSetData.Where(m => query.Any(q => q.DataId == m.Id) && m.Specificulture == culture);
                foreach (var item in data)
                {
                    result.Add(new AttributeDataViewModel(item, context, transaction));
                }
                return(Task.FromResult(new RepositoryResponse <List <AttributeDataViewModel> >()
                {
                    IsSucceed = true,
                    Data = result
                }));
            }
            catch (Exception ex)
            {
                return(Task.FromResult(UnitOfWorkHelper <MixCmsContext> .HandleException <List <AttributeDataViewModel> >(ex, isRoot, transaction)));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Dispose();
                }
            }
        }
예제 #3
0
        public static async Task <RepositoryResponse <List <TView> > > FilterByKeywordAsync <TView>(string culture, string attributeSetName
                                                                                                    , string filterType, string fieldName, string keyword
                                                                                                    , MixCmsContext _context = null, IDbContextTransaction _transaction = null)
            where TView : ViewModelBase <MixCmsContext, MixAttributeSetData, TView>
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                Expression <Func <MixAttributeSetValue, bool> > attrPredicate = m => m.Specificulture == culture && m.AttributeSetName == attributeSetName;
                Expression <Func <MixAttributeSetValue, bool> > valPredicate  = null;
                RepositoryResponse <List <TView> > result = new RepositoryResponse <List <TView> >()
                {
                    IsSucceed = true,
                    Data      = new List <TView>()
                };
                if (filterType == "equal")
                {
                    Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == fieldName && m.StringValue == keyword;
                    if (valPredicate != null)
                    {
                        valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                    else
                    {
                        valPredicate = pre;
                    }
                }
                else
                {
                    Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == fieldName && m.StringValue.Contains(keyword);
                    if (valPredicate != null)
                    {
                        valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                    else
                    {
                        valPredicate = pre;
                    }
                }
                if (valPredicate != null)
                {
                    attrPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, attrPredicate, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                }

                var query   = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct();
                var dataIds = query.ToList();
                if (query != null)
                {
                    Expression <Func <MixAttributeSetData, bool> > predicate = m => dataIds.Any(id => m.Id == id);
                    result = await DefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetModelListByAsync(
                        predicate, context, transaction);
                }
                return(result);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <List <TView> >(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Database.CloseConnection(); transaction.Dispose(); context.Dispose();
                }
            }
        }
예제 #4
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > FilterByKeywordAsync <TView>(HttpRequest request, MixCmsContext _context = null, IDbContextTransaction _transaction = null)
            where TView : ViewModelBase <MixCmsContext, MixAttributeSetData, TView>
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                var queryDictionary  = request.Query.ToList();
                var attributeSetName = request.Query["filterType"].ToString();
                var culture          = request.Query["culture"].ToString();
                var keyword          = request.Query["keyword"].ToString();
                var filterType       = request.Query["filterType"].ToString();
                var orderBy          = request.Query["orderBy"].ToString();
                int.TryParse(request.Query["direction"], out int direction);
                int.TryParse(request.Query["pageIndex"], out int pageIndex);
                int.TryParse(request.Query["pageSize"], out int pageSize);
                bool isFromDate = DateTime.TryParse(request.Query["fromDate"], out DateTime fromDate);
                bool isToDate   = DateTime.TryParse(request.Query["toDate"], out DateTime toDate);
                bool isStatus   = int.TryParse(request.Query["status"], out int status);
                var  tasks      = new List <Task <RepositoryResponse <TView> > >();
                var  getfields  = await MixAttributeFields.ReadViewModel.Repository.GetModelListByAsync(m => m.AttributeSetName == attributeSetName, context, transaction);

                var fields = getfields.IsSucceed ? getfields.Data : new List <MixAttributeFields.ReadViewModel>();
                Expression <Func <MixAttributeSetValue, bool> > attrPredicate =
                    m => m.Specificulture == culture && m.AttributeSetName == attributeSetName &&
                    (!isStatus || (m.Status == status)) &&
                    (!isFromDate || (m.CreatedDateTime >= fromDate)) &&
                    (!isToDate || (m.CreatedDateTime <= toDate))
                ;
                Expression <Func <MixAttributeSetValue, bool> > valPredicate = null;
                RepositoryResponse <PaginationModel <TView> >   result       = new RepositoryResponse <PaginationModel <TView> >()
                {
                    IsSucceed = true,
                    Data      = new PaginationModel <TView>()
                };

                if (queryDictionary != null)
                {
                    // filter by all fields if have keyword
                    if (!string.IsNullOrEmpty(keyword))
                    {
                        foreach (var field in fields)
                        {
                            Expression <Func <MixAttributeSetValue, bool> > pre =
                                m => m.AttributeFieldName == field.Name &&
                                (filterType == "equal" && m.StringValue == keyword) ||
                                (filterType == "contain" && (EF.Functions.Like(m.StringValue, $"%{keyword}%")));
                            if (valPredicate != null)
                            {
                                valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                            }
                            else
                            {
                                valPredicate = pre;
                            }
                        }
                    }
                    else // filter by specific field name
                    {
                        foreach (var q in queryDictionary)
                        {
                            if (fields.Any(f => f.Name == q.Key) && !string.IsNullOrEmpty(q.Value))
                            {
                                Expression <Func <MixAttributeSetValue, bool> > pre =
                                    m => m.AttributeFieldName == q.Key &&
                                    (filterType == "equal" && m.StringValue == (q.Value.ToString())) ||
                                    (filterType == "contain" && (EF.Functions.Like(m.StringValue, $"%{q.Value.ToString()}%")));
                                if (valPredicate != null)
                                {
                                    valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                                }
                                else
                                {
                                    valPredicate = pre;
                                }
                            }
                        }
                    }
                    if (valPredicate != null)
                    {
                        attrPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, attrPredicate, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                }

                var query   = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct();
                var dataIds = query.ToList();
                if (query != null)
                {
                    Expression <Func <MixAttributeSetData, bool> > predicate = m => dataIds.Any(id => m.Id == id);
                    result = await DefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetModelListByAsync(
                        predicate, orderBy, direction, pageSize, pageIndex, null, null, context, transaction);
                }
                return(result);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Database.CloseConnection(); transaction.Dispose(); context.Dispose();
                }
            }
        }
예제 #5
0
        public static async Task <RepositoryResponse <PaginationModel <TView> > > FilterByKeywordAsync <TView>(string culture, string attributeSetName
                                                                                                               , RequestPaging request, string keyword
                                                                                                               , Dictionary <string, Microsoft.Extensions.Primitives.StringValues> queryDictionary = null
                                                                                                               , MixCmsContext _context = null, IDbContextTransaction _transaction = null)
            where TView : ViewModelBase <MixCmsContext, MixAttributeSetData, TView>
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                Expression <Func <MixAttributeSetValue, bool> > attrPredicate =
                    m => m.Specificulture == culture && m.AttributeSetName == attributeSetName &&
                    (!request.FromDate.HasValue ||
                     (m.CreatedDateTime >= request.FromDate.Value)
                    ) &&
                    (!request.ToDate.HasValue ||
                     (m.CreatedDateTime <= request.ToDate.Value)
                    )
                ;
                Expression <Func <MixAttributeSetValue, bool> > valPredicate = null;
                RepositoryResponse <PaginationModel <TView> >   result       = new RepositoryResponse <PaginationModel <TView> >()
                {
                    IsSucceed = true,
                    Data      = new PaginationModel <TView>()
                };
                var filterType = queryDictionary.FirstOrDefault(q => q.Key == "filterType");
                var tasks      = new List <Task <RepositoryResponse <TView> > >();
                if (queryDictionary != null)
                {
                    foreach (var q in queryDictionary)
                    {
                        if (!string.IsNullOrEmpty(q.Key) && q.Key != "attributeSetId" && q.Key != "attributeSetName" && q.Key != "filterType" && !string.IsNullOrEmpty(q.Value))
                        {
                            if (!string.IsNullOrEmpty(filterType.Value) && filterType.Value == "equal")
                            {
                                Expression <Func <MixAttributeSetValue, bool> > pre = m =>
                                                                                      m.AttributeFieldName == q.Key && m.StringValue == (q.Value.ToString());
                                if (valPredicate != null)
                                {
                                    valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                                }
                                else
                                {
                                    valPredicate = pre;
                                }
                            }
                            else
                            {
                                Expression <Func <MixAttributeSetValue, bool> > pre =
                                    m => m.AttributeFieldName == q.Key &&
                                    (EF.Functions.Like(m.StringValue, $"%{q.Value.ToString()}%"));
                                if (valPredicate != null)
                                {
                                    valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                                }
                                else
                                {
                                    valPredicate = pre;
                                }
                            }
                        }
                    }
                    if (valPredicate != null)
                    {
                        attrPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, attrPredicate, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                }
                // Loop queries string => predicate
                if (!string.IsNullOrEmpty(keyword))
                {
                    Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeSetName == attributeSetName && m.Specificulture == culture && m.StringValue.Contains(keyword);
                    attrPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(attrPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                }

                var query   = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct();
                var dataIds = query.ToList();
                if (query != null)
                {
                    Expression <Func <MixAttributeSetData, bool> > predicate = m => dataIds.Any(id => m.Id == id);
                    result = await DefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetModelListByAsync(
                        predicate, request.OrderBy, request.Direction, request.PageSize, request.PageIndex, null, null, context, transaction);
                }
                return(result);
            }
            catch (Exception ex)
            {
                return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Database.CloseConnection(); transaction.Dispose(); context.Dispose();
                }
            }
        }
예제 #6
0
        public static Task <RepositoryResponse <List <TView> > > FilterByValueAsync <TView>(string culture, string attributeSetName
                                                                                            , Dictionary <string, Microsoft.Extensions.Primitives.StringValues> queryDictionary
                                                                                            , MixCmsContext _context = null, IDbContextTransaction _transaction = null)
            where TView : ODataViewModelBase <MixCmsContext, MixAttributeSetData, TView>
        {
            UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot);

            try
            {
                Expression <Func <MixAttributeSetValue, bool> > valPredicate = m => m.Specificulture == culture && m.AttributeSetName == attributeSetName;
                RepositoryResponse <List <TView> > result = new RepositoryResponse <List <TView> >()
                {
                    IsSucceed = true,
                    Data      = new List <TView>()
                };
                var tasks = new List <Task <RepositoryResponse <TView> > >();

                // Loop queries string => predicate
                foreach (var q in queryDictionary)
                {
                    if (!string.IsNullOrEmpty(q.Key) && !string.IsNullOrEmpty(q.Value))
                    {
                        Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == q.Key && m.StringValue.Contains(q.Value);
                        valPredicate = ODataHelper <MixAttributeSetValue> .CombineExpression(valPredicate, pre, Microsoft.OData.UriParser.BinaryOperatorKind.And);
                    }
                }
                var query = context.MixAttributeSetValue.Where(valPredicate).Select(m => m.DataId).Distinct().ToList();
                if (query != null)
                {
                    foreach (var item in query)
                    {
                        tasks.Add(Task.Run(async() =>
                        {
                            var resp = await ODataDefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetSingleModelAsync(
                                m => m.Id == item && m.Specificulture == culture);
                            return(resp);
                        }));
                    }
                    var continuation = Task.WhenAll(tasks);
                    continuation.Wait();
                    if (continuation.Status == TaskStatus.RanToCompletion)
                    {
                        foreach (var data in continuation.Result)
                        {
                            if (data.IsSucceed)
                            {
                                result.Data.Add(data.Data);
                            }
                            else
                            {
                                result.Errors.AddRange(data.Errors);
                            }
                        }
                    }
                    // Display information on faulted tasks.
                    else
                    {
                        foreach (var t in tasks)
                        {
                            result.Errors.Add($"Task {t.Id}: {t.Status}");
                        }
                    }
                }
                return(Task.FromResult(result));
            }
            catch (Exception ex)
            {
                return(Task.FromResult(UnitOfWorkHelper <MixCmsContext> .HandleException <List <TView> >(ex, isRoot, transaction)));
            }
            finally
            {
                if (isRoot)
                {
                    //if current Context is Root
                    context.Database.CloseConnection(); transaction.Dispose(); context.Dispose();
                }
            }
        }