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); }
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(); } } }
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(); } } }
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(); } } }
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(); } } }
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(); } } }