public static async Task <RepositoryResponse <PaginationModel <TView> > > GetPostListByDataIds <TView>( List <string> dataIds , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var result = new RepositoryResponse <PaginationModel <TView> >(); Expression <Func <MixRelatedAttributeData, bool> > predicate = m => m.Specificulture == culture && dataIds.Contains(m.DataId) && m.ParentType == MixEnums.MixAttributeSetDataType.Post.ToString(); foreach (var id in dataIds) { Expression <Func <MixRelatedAttributeData, bool> > pre = m => m.DataId == id; predicate = ReflectionHelper.CombineExpression( predicate , pre , Heart.Enums.MixHeartEnums.ExpressionMethod.And); } var getRelatedData = await MixRelatedAttributeDatas.ReadViewModel.Repository.GetModelListByAsync( predicate , orderByPropertyName = "CreatedDateTime", direction, pageSize, pageIndex , _context : context, _transaction : transaction ); if (getRelatedData.IsSucceed) { foreach (var item in getRelatedData.Data.Items) { if (int.TryParse(item.ParentId, out int postId)) { var getData = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetSingleModelAsync( m => m.Specificulture == item.Specificulture && m.Id == postId , context, transaction); if (getData.IsSucceed) { result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() { Items = new List <TView>(), PageIndex = pageIndex ?? 0, PageSize = pageSize } }; result.Data.Items.Add(getData.Data); } } } result.Data.TotalItems = getRelatedData.Data.TotalItems; result.Data.TotalPage = getRelatedData.Data.TotalPage; } 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 async Task <RepositoryResponse <PaginationModel <TView> > > GetPostListByDataId <TView>( string dataId , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.DisplayDirection direction = Heart.Enums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetAppSetting <string>("DefaultCulture"); var getRelatedData = await MixDatabaseDataAssociations.ReadViewModel.Repository.GetModelListByAsync( m => m.Specificulture == culture && m.DataId == dataId && m.ParentType == MixDatabaseParentType.Post , orderByPropertyName = "CreatedDateTime", direction, pageSize, pageIndex , _context : context, _transaction : transaction ); var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() { Items = new List <TView>(), PageIndex = pageIndex ?? 0, PageSize = pageSize } }; if (getRelatedData.IsSucceed) { foreach (var item in getRelatedData.Data.Items) { if (int.TryParse(item.ParentId, out int postId)) { var getData = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetSingleModelAsync( m => m.Specificulture == item.Specificulture && m.Id == postId , context, transaction); if (getData.IsSucceed) { result.Data.Items.Add(getData.Data); } } } result.Data.TotalItems = getRelatedData.Data.TotalItems; result.Data.TotalPage = getRelatedData.Data.TotalPage; } return(result); } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
private async Task <RepositoryResponse <bool> > ImportPagesAsync(string destCulture, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { int startId = MixPages.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data; int startModuleId = MixModules.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data; //var pages = MixFileRepository.Instance.GetFile(MixConstants.CONST_FILE_PAGES, MixFolders.JsonDataFolder, true, "{}"); //var obj = JObject.Parse(pages.Content); //var initPages = obj["data"].ToObject<JArray>(); foreach (var item in Pages) { // store old id => update to related data if save success var oldId = item.Id; item.CreatedBy = CreatedBy; // TODO: Id > 7 => not system init page if (!context.MixPage.Any(p => p.SeoName == item.SeoName)) { startId++; item.Id = startId; item.CreatedDateTime = DateTime.UtcNow; item.ThemeName = ThemeName; item.Specificulture = destCulture; var saveResult = await item.SaveModelAsync(false, context, transaction); if (!saveResult.IsSucceed) { result.IsSucceed = false; result.Exception = saveResult.Exception; result.Errors = saveResult.Errors; break; } } if (!dicPageIds.Any(m => m.Key == item.Id)) { dicPageIds.Add(oldId, startId); } } UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { var error = UnitOfWorkHelper <MixCmsContext> .HandleException <MixPages.ImportViewModel>(ex, isRoot, transaction); result.IsSucceed = false; result.Errors = error.Errors; result.Exception = error.Exception; } finally { //if current Context is Root if (isRoot) { UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } return(result); }
public void LoadData(int?postId = null, int?productId = null, int?pageId = null , int?pageSize = null, int?pageIndex = 0 , MixCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { pageSize = pageSize > 0 ? pageSize : PageSize; pageIndex = pageIndex > 0 ? pageIndex : 0; Expression <Func <MixModuleData, bool> > dataExp = null; Expression <Func <MixModulePost, bool> > postExp = null; switch (Type) { case MixModuleType.Content: case MixModuleType.Data: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; //postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; //productExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; break; case MixModuleType.ListPost: postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; default: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; } if (dataExp != null) { var getDataResult = MixModuleDatas.ReadViewModel.Repository .GetModelListBy( dataExp , MixService.GetConfig <string>(MixAppSettingKeywords.OrderBy ), 0 , pageSize, pageIndex , _context: context, _transaction: transaction); if (getDataResult.IsSucceed) { //getDataResult.Data.JsonItems = new List<JObject>(); //getDataResult.Data.Items.ForEach(d => getDataResult.Data.JsonItems.Add(d.JItem)); Data = getDataResult.Data; } } if (postExp != null) { var getPosts = MixModulePosts.ReadViewModel.Repository .GetModelListBy(postExp , MixService.GetConfig <string>(MixAppSettingKeywords.OrderBy), 0 , pageSize, pageIndex , _context: context, _transaction: transaction); if (getPosts.IsSucceed) { Posts = getPosts.Data; } } } catch (Exception ex) { UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <ReadMvcViewModel> >(ex, isRoot, transaction); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
public static async Task <RepositoryResponse <PaginationModel <TView> > > GetPostListByValueId <TView>( string valueId , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() { PageIndex = pageIndex.HasValue ? pageIndex.Value : 0, PageSize = pageSize } }; // Get Tag var getVal = await MixAttributeSetValues.ReadViewModel.Repository.GetSingleModelAsync( m => m.Specificulture == culture && m.Status == MixEnums.MixContentStatus.Published.ToString() && m.Id == valueId , context, transaction); if (getVal.IsSucceed) { result = await GetPostListByDataId <TView>( dataId : getVal.Data.DataId, culture : culture, orderByPropertyName : orderByPropertyName, direction : direction, pageSize : pageSize, pageIndex : pageIndex, _context : context, _transaction : transaction); //var query = context.MixRelatedAttributeData.Where(m=> m.Specificulture == culture // && m.Id == getVal.Data.DataId && m.ParentId == parentId && m.ParentType == (int) MixEnums.MixAttributeSetDataType.Post) // .Select(m => m.ParentId).Distinct().ToList(); } 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 void LoadData(int?pageSize = null, int?pageIndex = null , SioCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <SioCmsContext> .InitTransaction(_context, _transaction, out SioCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { pageSize = pageSize > 0 ? pageSize : PageSize; pageIndex = pageIndex ?? 0; Expression <Func <SioPageModule, bool> > dataExp = null; Expression <Func <SioPageArticle, bool> > articleExp = null; Expression <Func <SioPageProduct, bool> > productExp = null; foreach (var item in Modules) { item.Module.LoadData(pageSize: pageSize, pageIndex: pageIndex, _context: context, _transaction: transaction); } switch (Type) { case SioPageType.ListArticle: articleExp = n => n.CategoryId == Id && n.Specificulture == Specificulture; break; case SioPageType.ListProduct: productExp = n => n.CategoryId == Id && n.Specificulture == Specificulture; break; default: dataExp = m => m.CategoryId == Id && m.Specificulture == Specificulture; articleExp = n => n.CategoryId == Id && n.Specificulture == Specificulture; productExp = m => m.CategoryId == Id && m.Specificulture == Specificulture; break; } if (articleExp != null) { var getArticles = SioPageArticles.ReadViewModel.Repository .GetModelListBy(articleExp , SioService.GetConfig <string>(SioConstants.ConfigurationKeyword.OrderBy), 0 , pageSize, pageIndex , _context: context, _transaction: transaction); if (getArticles.IsSucceed) { Articles = getArticles.Data; } } if (productExp != null) { var getProducts = SioPageProducts.ReadViewModel.Repository .GetModelListBy(productExp , SioService.GetConfig <string>(SioConstants.ConfigurationKeyword.OrderBy), 0 , pageSize, pageIndex , _context: context, _transaction: transaction); if (getProducts.IsSucceed) { Products = getProducts.Data; } } } catch (Exception ex) { UnitOfWorkHelper <SioCmsContext> .HandleException <PaginationModel <ReadMvcViewModel> >(ex, isRoot, transaction); } finally { if (isRoot) { //if current Context is Root context.Dispose(); } } }
private async Task <RepositoryResponse <bool> > ImportPagesAsync(string destCulture, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { int startId = MixPages.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data; int startModuleId = MixModules.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data; //var pages = FileRepository.Instance.GetFile(MixConstants.CONST_FILE_PAGES, "data", true, "{}"); //var obj = JObject.Parse(pages.Content); //var initPages = obj["data"].ToObject<JArray>(); foreach (var item in Pages) { // TODO: Id > 7 => not system init page if (!context.MixPage.Any(p => p.SeoName == item.SeoName)) { // store old id => update to related data if save success var oldId = item.Id; startId++; dicPageIds.Add(oldId, startId); item.Id = startId; item.CreatedDateTime = DateTime.UtcNow; item.ThemeName = ThemeName; if (item.ModuleNavs != null) { foreach (var nav in item.ModuleNavs) { startModuleId++; dicModuleIds.Add(nav.Module.Id, startModuleId); nav.Module.Id = startModuleId; nav.PageId = startId; nav.ModuleId = startModuleId; } } //if (_context.MixPage.Any(m=>m.Id == startId)) //(item.Id > initPages.Count) //{ // item.Id = _context.MixPage.Max(m => m.Id) + 1; // item.CreatedDateTime = DateTime.UtcNow; //} if (!string.IsNullOrEmpty(item.Image)) { item.Image = item.Image.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", destCulture)}"); } if (!string.IsNullOrEmpty(item.Thumbnail)) { item.Thumbnail = item.Thumbnail.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", destCulture)}"); } item.Specificulture = destCulture; var saveResult = await item.SaveModelAsync(true, context, transaction); if (!saveResult.IsSucceed) { result.IsSucceed = false; result.Exception = saveResult.Exception; result.Errors = saveResult.Errors; break; } } } UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { var error = UnitOfWorkHelper <MixCmsContext> .HandleException <MixPages.ImportViewModel>(ex, isRoot, transaction); result.IsSucceed = false; result.Errors = error.Errors; result.Exception = error.Exception; } finally { //if current Context is Root if (isRoot) { context.Database.CloseConnection(); transaction.Dispose(); context.Dispose(); } } return(result); }
public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPost <TView>( string keyword , List <string> dataIds , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() }; List <int> postIds = null; Expression <Func <MixRelatedAttributeData, bool> > predicate = m => m.Specificulture == culture && m.ParentType == MixEnums.MixAttributeSetDataType.Post.ToString(); foreach (var id in dataIds) { // Get list related post ids by data id Expression <Func <MixRelatedAttributeData, bool> > dataPredicate = m => m.Specificulture == culture && m.ParentType == MixEnums.MixAttributeSetDataType.Post.ToString() && m.DataId == id; var ids = context.MixRelatedAttributeData.Where(dataPredicate).Select(m => int.Parse(m.ParentId)).ToList(); // if first id in list => return ids if (postIds == null) { postIds = ids.Distinct().ToList(); } else { // filter ids by new data id ( for 'AND' condition) postIds = postIds.Where(m => ids.Contains(m)).Distinct().ToList(); // if there is no items => no need to filter more if (postIds.Count == 0) { break; } } } // Load Posts Expression <Func <MixPost, bool> > postPredicate = m => m.Specificulture == culture && (string.IsNullOrEmpty(keyword) || (EF.Functions.Like(m.Title, $"%{keyword}%")) || (EF.Functions.Like(m.Excerpt, $"%{keyword}%")) || (EF.Functions.Like(m.Content, $"%{keyword}%"))); if (postIds != null && postIds.Count > 0) { postPredicate = m => m.Specificulture == culture && (string.IsNullOrEmpty(keyword) || (EF.Functions.Like(m.Title, $"%{keyword}%")) || (EF.Functions.Like(m.Excerpt, $"%{keyword}%")) || (EF.Functions.Like(m.Content, $"%{keyword}%"))) && postIds.Any(n => n == m.Id); } var getPosts = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetModelListByAsync( postPredicate , orderByPropertyName, direction , pageSize, pageIndex , _context : context, _transaction : transaction); result = getPosts; 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> > > GetPostListByValueIds <TView>( List <string> valueIds , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() { PageIndex = pageIndex.HasValue ? pageIndex.Value : 0, PageSize = pageSize } }; // Get Data Expression <Func <MixAttributeSetValue, bool> > predicate = m => m.Specificulture == culture && m.Status == MixEnums.MixContentStatus.Published; foreach (var item in valueIds) { Expression <Func <MixAttributeSetValue, bool> > pre = m => m.Id == item; predicate = ReflectionHelper.CombineExpression( predicate , pre , Heart.Enums.MixHeartEnums.ExpressionMethod.And); } var getVal = await MixAttributeSetValues.ReadViewModel.Repository.GetModelListByAsync(predicate, context, transaction); if (getVal.IsSucceed) { var dataIds = getVal.Data.Select(m => m.DataId).Distinct(); if (dataIds.Count() == 1) { result = await GetPostListByDataIds <TView>( dataIds : dataIds.ToList(), culture : culture, orderByPropertyName : orderByPropertyName, direction : direction, pageSize : pageSize, pageIndex : pageIndex, _context : context, _transaction : transaction); } //var query = context.MixRelatedAttributeData.Where(m=> m.Specificulture == culture // && m.Id == getVal.Data.DataId && m.ParentId == parentId && m.ParentType == (int) MixEnums.MixAttributeSetDataType.Post) // .Select(m => m.ParentId).Distinct().ToList(); } return(result); } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPost <TView>( string keyword , List <string> dataIds , List <int> pageIds = null , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); Expression <Func <MixPost, bool> > postPredicate = m => m.Specificulture == culture && (string.IsNullOrEmpty(keyword) || (EF.Functions.Like(m.Title, $"%{keyword}%")) || (EF.Functions.Like(m.Excerpt, $"%{keyword}%")) || (EF.Functions.Like(m.Content, $"%{keyword}%"))); if (dataIds.Count > 0) { var searchPostByDataIds = SearchPostByDataIdsPredicate(dataIds, culture, context); postPredicate = searchPostByDataIds.AndAlso(postPredicate); } if (pageIds != null && pageIds.Count > 0) { var searchPostByPageIds = SearchPostByPageIdsPredicate(pageIds, culture, context); postPredicate = searchPostByPageIds.AndAlso(postPredicate); } if (!typeof(MixPost).GetProperties().Any(p => p.Name.ToLower() == orderByPropertyName.ToLower())) { var postIds = context.MixPost.Where(postPredicate).Select(p => p.Id); var orderedPostIds = context.MixRelatedAttributeData.Where( m => m.Specificulture == culture && postIds.Any(p => p.ToString() == m.ParentId)) .Join(context.MixAttributeSetValue, r => r.DataId, v => v.DataId, (r, v) => new { r, v }) .OrderBy(rv => rv.v.StringValue) .Select(rv => rv.r.ParentId); postPredicate = p => orderedPostIds.Distinct().Any(o => o == p.Id.ToString() && p.Specificulture == culture); } return(await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetModelListByAsync( postPredicate , orderByPropertyName, direction , pageSize, pageIndex , _context : context, _transaction : transaction)); } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
/// <summary> /// Saves the model. /// </summary> /// <param name="isSaveSubModels">if set to <c>true</c> [is save sub models].</param> /// <param name="_context">The context.</param> /// <param name="_transaction">The transaction.</param> /// <returns></returns> public virtual RepositoryResponse <TView> SaveModel(bool isSaveSubModels = false, TDbContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <TDbContext> .InitTransaction(_context, _transaction, out TDbContext context, out IDbContextTransaction transaction, out bool isRoot); RepositoryResponse <TView> result = new RepositoryResponse <TView>() { IsSucceed = true }; Validate(context, transaction); if (IsValid) { try { ParseModel(context, transaction); result = Repository.SaveModel((TView)this, _context: context, _transaction: transaction); // Save sub Models if (result.IsSucceed && isSaveSubModels) { var saveResult = SaveSubModels(Model, context, transaction); if (!saveResult.IsSucceed) { result.Errors.AddRange(saveResult.Errors); result.Exception = saveResult.Exception; } result.IsSucceed = result.IsSucceed && saveResult.IsSucceed; } UnitOfWorkHelper <TDbContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); return(result); } catch (Exception ex) { return(UnitOfWorkHelper <TDbContext> .HandleException <TView>(ex, isRoot, transaction)); } finally { if (result.IsSucceed && IsCache) { RemoveCache(Model, context, transaction).ConfigureAwait(true).GetAwaiter(); } if (isRoot) { //if current Context is Root UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction); } } } else { if (isRoot) { //if current Context is Root UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction); } return(new RepositoryResponse <TView>() { IsSucceed = false, Data = null, Errors = Errors }); } }
/// <summary> /// Clones the asynchronous. /// </summary> /// <param name="model"></param> /// <param name="cloneCultures">The clone cultures.</param> /// <param name="_context">The context.</param> /// <param name="_transaction">The transaction.</param> /// <returns></returns> public virtual async Task <RepositoryResponse <List <TView> > > CloneAsync(TModel model, List <SupportedCulture> cloneCultures , TDbContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <TDbContext> .InitTransaction(_context, _transaction, out TDbContext context, out IDbContextTransaction transaction, out bool isRoot); RepositoryResponse <List <TView> > result = new RepositoryResponse <List <TView> >() { IsSucceed = true, Data = new List <TView>() }; try { if (cloneCultures != null) { foreach (var culture in cloneCultures) { string desSpecificulture = culture.Specificulture; TModel m = (TModel)context.Entry(model).CurrentValues.ToObject(); Type myType = typeof(TModel); var myFieldInfo = myType.GetProperty("Specificulture"); myFieldInfo.SetValue(m, desSpecificulture); bool isExist = Repository.CheckIsExists(m, _context: context, _transaction: transaction); if (isExist) { result.IsSucceed = true; } else { context.Entry(m).State = EntityState.Added; await context.SaveChangesAsync(); var cloneSubResult = await CloneSubModelsAsync(m, cloneCultures, context, transaction).ConfigureAwait(false); if (!cloneSubResult.IsSucceed) { cloneSubResult.Errors.AddRange(cloneSubResult.Errors); cloneSubResult.Exception = cloneSubResult.Exception; } result.IsSucceed = result.IsSucceed && cloneSubResult.IsSucceed && cloneSubResult.IsSucceed; } _ = this.SendNotifyAsync(this, RepositoryAction.Clone, result.IsSucceed); } UnitOfWorkHelper <TDbContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); return(result); } else { return(result); } } catch (Exception ex) { return(UnitOfWorkHelper <TDbContext> .HandleException <List <TView> >(ex, isRoot, transaction)); } finally { if (isRoot) { UnitOfWorkHelper <TDbContext> .CloseDbContext(ref context, ref transaction); } } }
public static RepositoryResponse <AdditionalViewModel> LoadAdditionalData( MixDatabaseParentType parentType, string parentId, string databaseName, string culture = null, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { var dataId = context.MixRelatedAttributeData.FirstOrDefault( m => m.AttributeSetName == databaseName && m.ParentType == parentType && m.ParentId == parentId && m.Specificulture == culture)?.DataId; if (!string.IsNullOrEmpty(dataId)) { return(AdditionalViewModel.Repository.GetSingleModel( m => m.Id == dataId && m.Specificulture == culture , context, transaction)); } else { // Init default data var getAttrSet = MixAttributeSets.UpdateViewModel.Repository.GetSingleModel( m => m.Name == databaseName , context, transaction); if (getAttrSet.IsSucceed) { AdditionalViewModel result = new AdditionalViewModel() { Specificulture = culture, AttributeSetId = getAttrSet.Data.Id, AttributeSetName = getAttrSet.Data.Name, Status = MixContentStatus.Published, Fields = getAttrSet.Data.Fields, ParentType = parentType, ParentId = parentId }; result.ExpandView(context, transaction); return(new RepositoryResponse <AdditionalViewModel>() { IsSucceed = true, Data = result }); } return(new RepositoryResponse <AdditionalViewModel>()); } } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <AdditionalViewModel>(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPost <TView>( string keyword , List <string> dataIds , List <int> pageIds = null , string culture = null , string orderByPropertyName = "CreatedDateTime" , Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = null , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() }; List <int> postIds = SearchPostByDataIds(dataIds, culture, context); if (pageIds != null && pageIds.Count > 0) { postIds.AddRange(SearchPostByPageIds(pageIds, culture, context)); postIds = postIds.Distinct().ToList(); } // Load Posts if (postIds != null && postIds.Count > 0) { Expression <Func <MixPost, bool> > postPredicate = m => m.Specificulture == culture && (string.IsNullOrEmpty(keyword) || (EF.Functions.Like(m.Title, $"%{keyword}%")) || (EF.Functions.Like(m.Excerpt, $"%{keyword}%")) || (EF.Functions.Like(m.Content, $"%{keyword}%"))) && postIds.Any(n => n == m.Id); var getPosts = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetModelListByAsync( postPredicate , orderByPropertyName, direction , pageSize, pageIndex , _context : context, _transaction : transaction); result = getPosts; } 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> > > GetModelistByMeta <TView>( string culture, string metaName, string metaValue , string orderByPropertyName, int direction, int?pageSize, int?pageIndex , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() { PageIndex = pageIndex.HasValue ? pageIndex.Value : 0, PageSize = pageSize } }; var tasks = new List <Task <RepositoryResponse <TView> > >(); // Get Tag var getVal = await MixAttributeSetValues.ReadViewModel.Repository.GetSingleModelAsync(m => m.AttributeSetName == metaName && m.StringValue == metaValue , context, transaction); if (getVal.IsSucceed) { var getRelatedData = await MixRelatedAttributeDatas.ReadViewModel.Repository.GetModelListByAsync( m => m.Specificulture == culture && m.Id == getVal.Data.DataId && m.ParentType == (int)MixEnums.MixAttributeSetDataType.Post , orderByPropertyName, direction, pageIndex, pageSize , _context : context, _transaction : transaction ); if (getRelatedData.IsSucceed) { foreach (var item in getRelatedData.Data.Items) { if (int.TryParse(item.ParentId, out int postId)) { var getData = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetSingleModelAsync( m => m.Specificulture == item.Specificulture && m.Id == postId , context, transaction); if (getData.IsSucceed) { result.Data.Items.Add(getData.Data); } } } result.Data.TotalItems = getRelatedData.Data.TotalItems; result.Data.TotalPage = getRelatedData.Data.TotalPage; } //var query = context.MixRelatedAttributeData.Where(m=> m.Specificulture == culture // && m.Id == getVal.Data.DataId && m.ParentId == parentId && m.ParentType == (int) MixEnums.MixAttributeSetDataType.Post) // .Select(m => m.ParentId).Distinct().ToList(); } Expression <Func <MixAttributeSetValue, bool> > valPredicate = m => m.Specificulture == culture && m.AttributeSetName == metaName && m.StringValue == metaValue; 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> > > GetModelistByAddictionalField <TView>( string fieldName, string value, string culture , string orderByPropertyName = "CreatedDateTime", Heart.Enums.MixHeartEnums.DisplayDirection direction = Heart.Enums.MixHeartEnums.DisplayDirection.Desc , int?pageSize = null, int?pageIndex = 0 , MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { var result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() { PageIndex = pageIndex.HasValue ? pageIndex.Value : 0, PageSize = pageSize } }; var tasks = new List <Task <RepositoryResponse <TView> > >(); // Get Value var dataIds = await context.MixAttributeSetValue.Where( m => m.AttributeSetName == MixConstants.AttributeSetName.ADDITIONAL_FIELD_POST && m.Specificulture == culture && m.StringValue == value && m.AttributeFieldName == fieldName) .Select(m => m.DataId)?.ToListAsync(); if (dataIds != null && dataIds.Count > 0) { var getRelatedData = await MixRelatedAttributeDatas.ReadViewModel.Repository.GetModelListByAsync( m => dataIds.Contains(m.DataId) , orderByPropertyName, direction, pageSize, pageIndex , _context : context, _transaction : transaction ); if (getRelatedData.IsSucceed) { foreach (var item in getRelatedData.Data.Items) { if (int.TryParse(item.ParentId, out int postId)) { var getData = await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetSingleModelAsync( m => m.Specificulture == item.Specificulture && m.Id == postId , context, transaction); if (getData.IsSucceed) { result.Data.Items.Add(getData.Data); } } } result.Data.TotalItems = getRelatedData.Data.TotalItems; result.Data.TotalPage = getRelatedData.Data.TotalPage; } } 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, 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["attributeSetName"].ToString(); var keyword = request.Query["keyword"].ToString(); var filterType = request.Query["filterType"].ToString(); var orderBy = request.Query["orderBy"].ToString(); int.TryParse(request.Query["attributeSetId"], out int attributeSetId); bool isDirection = Enum.TryParse(request.Query["direction"], out Heart.Enums.MixHeartEnums.DisplayDirection 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 = Enum.TryParse(request.Query["status"], out MixEnums.MixContentStatus status); var tasks = new List <Task <RepositoryResponse <TView> > >(); var getfields = await MixAttributeFields.ReadViewModel.Repository.GetModelListByAsync( m => m.AttributeSetId == attributeSetId || m.AttributeSetName == attributeSetName, context, transaction); var fields = getfields.IsSucceed ? getfields.Data : new List <MixAttributeFields.ReadViewModel>(); var fieldQueries = !string.IsNullOrEmpty(request.Query["query"]) ? JObject.Parse(request.Query["query"]) : new JObject(); // fitler list query by field name //var fieldQueries = queryDictionary?.Where(m => fields.Any(f => f.Name == m.Key)).ToList() // ?? new List<KeyValuePair<string, Microsoft.Extensions.Primitives.StringValues>>(); Expression <Func <MixAttributeSetValue, bool> > attrPredicate = m => m.Specificulture == culture && (m.AttributeSetName == attributeSetName); // val predicate Expression <Func <MixAttributeSetValue, bool> > valPredicate = null; // Data predicate Expression <Func <MixAttributeSetData, bool> > predicate = null; // m => m.Specificulture == culture; //&& (m.AttributeSetId == attributeSetId || m.AttributeSetName == attributeSetName) //&& (!isStatus || (m.Status == status.ToString())) //&& (!isFromDate || (m.CreatedDateTime >= fromDate)) //&& (!isToDate || (m.CreatedDateTime <= toDate)); RepositoryResponse <PaginationModel <TView> > result = new RepositoryResponse <PaginationModel <TView> >() { IsSucceed = true, Data = new PaginationModel <TView>() }; // if filter by field name or keyword => filter by attr value if (fieldQueries.Count > 0 || !string.IsNullOrEmpty(keyword)) { // 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 = ReflectionHelper.CombineExpression(valPredicate, pre, Heart.Enums.MixHeartEnums.ExpressionMethod.And); } else { valPredicate = pre; } } } if (fieldQueries != null && fieldQueries.Properties().Count() > 0) // filter by specific field name { foreach (var q in fieldQueries) { if (fields.Any(f => f.Name == q.Key)) { string value = q.Value.ToString(); if (!string.IsNullOrEmpty(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 = ReflectionHelper.CombineExpression(valPredicate, pre, Heart.Enums.MixHeartEnums.ExpressionMethod.Or); } else { valPredicate = pre; } } } } } if (valPredicate != null) { attrPredicate = attrPredicate == null ? valPredicate : ReflectionHelper.CombineExpression(valPredicate, attrPredicate, Heart.Enums.MixHeartEnums.ExpressionMethod.And); } if (attrPredicate != null) { var query = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct(); var dataIds = query.ToList(); if (query != null) { Expression <Func <MixAttributeSetData, bool> > pre = m => dataIds.Any(id => m.Id == id); predicate = pre; // ReflectionHelper.CombineExpression(pre, predicate, Heart.Enums.MixHeartEnums.ExpressionMethod.And); } } } else { predicate = m => m.Specificulture == culture && (m.AttributeSetId == attributeSetId || m.AttributeSetName == attributeSetName) && (!isStatus || (m.Status == status.ToString())) && (!isFromDate || (m.CreatedDateTime >= fromDate)) && (!isToDate || (m.CreatedDateTime <= toDate)); } 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 <AdditionalViewModel> > GetAdditionalData( MixEnums.MixAttributeSetDataType parentType, int parentId, HttpRequest request, string culture = null, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { // Additional Data is sub data of page / post / module only culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var databaseName = request.Query["databaseName"].ToString(); var dataId = (await context.MixRelatedAttributeData.FirstOrDefaultAsync( m => m.AttributeSetName == databaseName && m.ParentType == parentType.ToString() && m.ParentId == parentId.ToString() && m.Specificulture == culture))?.DataId; if (!string.IsNullOrEmpty(dataId)) { return(await AdditionalViewModel.Repository.GetSingleModelAsync( m => m.Id == dataId && m.Specificulture == culture , context, transaction)); } else { // Init default data var getAttrSet = await Lib.ViewModels.MixAttributeSets.UpdateViewModel.Repository.GetSingleModelAsync( m => m.Name == request.Query["databaseName"].ToString() , context, transaction); if (getAttrSet.IsSucceed) { AdditionalViewModel result = new AdditionalViewModel() { Specificulture = culture, AttributeSetId = getAttrSet.Data.Id, AttributeSetName = getAttrSet.Data.Name, Status = MixEnums.MixContentStatus.Published, Fields = getAttrSet.Data.Fields, ParentType = parentType }; result.ExpandView(context, transaction); return(new RepositoryResponse <AdditionalViewModel>() { IsSucceed = true, Data = result }); } } return(new RepositoryResponse <AdditionalViewModel>()); } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <AdditionalViewModel>(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
public override Task RemoveCache(MixAttributeSetValue model, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); Task result = null; var tasks = new List <Task>(); try { var navs = context.MixRelatedAttributeData.Where(m => m.Id == model.DataId && m.Specificulture == model.Specificulture); if (navs != null) { foreach (var item in navs) { switch (item.ParentType) { case 0: break; case 1: break; case 2: int.TryParse(item.ParentId, out int postId); var post = context.MixPost.FirstOrDefault(m => m.Id == postId && m.Specificulture == Specificulture); if (post != null) { tasks.Add(MixPosts.ReadViewModel.Repository.RemoveCache(post, context, transaction)); } break; case 3: int.TryParse(item.ParentId, out int pageId); var page = context.MixPage.FirstOrDefault(m => m.Id == pageId && m.Specificulture == Specificulture); if (page != null) { tasks.Add(MixPages.ReadViewModel.Repository.RemoveCache(page, context, transaction)); } break; case 4: int.TryParse(item.ParentId, out int moduleId); var module = context.MixModule.FirstOrDefault(m => m.Id == moduleId && m.Specificulture == Specificulture); if (module != null) { tasks.Add(MixModules.ReadListItemViewModel.Repository.RemoveCache(module, context, transaction)); } break; case 5: break; default: break; } } } tasks.Add(base.RemoveCache(model, context, transaction)); result = Task.WhenAll(tasks); result.Wait(); return(result); } catch (Exception ex) { UnitOfWorkHelper <MixCmsContext> .HandleException <UpdateViewModel>(ex, isRoot, transaction); return(Task.FromException(ex)); } finally { if (isRoot && (result.Status == TaskStatus.RanToCompletion || result.Status == TaskStatus.Canceled || result.Status == TaskStatus.Faulted)) { //if current Context is Root context.Database.CloseConnection(); transaction.Dispose(); context.Dispose(); } } }
public async Task <RepositoryResponse <bool> > ImportAsync(string destCulture, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { if (Configurations != null && Configurations.Count > 0) { result = await ImportConfigurationsAsync(destCulture, context, transaction); } if (result.IsSucceed && Languages != null && Languages.Count > 0) { result = await ImportLanguagesAsync(destCulture, context, transaction); } if (result.IsSucceed && Pages != null && Pages.Count > 0) { result = await ImportPagesAsync(destCulture, context, transaction); } if (result.IsSucceed && Modules != null && Modules.Count > 0) { result = await ImportModulesAsync(destCulture, context, transaction); } if (result.IsSucceed && ModuleDatas.Count > 0) { result = await ImportModuleDatas(destCulture, context, transaction); } if (result.IsSucceed && Posts != null && Posts.Count > 0) { result = await ImportPostsAsync(destCulture, context, transaction); } if (result.IsSucceed && AttributeSets != null && AttributeSets.Count > 0) { result = await ImportAttributeSetsAsync(context, transaction); } if (result.IsSucceed && AttributeSetDatas.Count > 0) { result = await ImportAttributeSetDatas(destCulture, context, transaction); } if (result.IsSucceed && RelatedData.Count > 0) { result = await ImportRelatedDatas(destCulture, context, transaction); } UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { var error = UnitOfWorkHelper <MixCmsContext> .HandleException <MixPages.ImportViewModel>(ex, isRoot, transaction); result.IsSucceed = false; result.Errors = error.Errors; result.Exception = error.Exception; } finally { //if current Context is Root if (isRoot) { UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } return(result); }
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.Dispose(); } } }
public void LoadData(int?articleId = null, int?productId = null, int?categoryId = null , int?pageSize = null, int?pageIndex = 0 , MixCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { pageSize = pageSize > 0 ? PageSize : PageSize; pageIndex = pageIndex ?? 0; Expression <Func <MixModuleData, bool> > dataExp = null; Expression <Func <MixModuleArticle, bool> > articleExp = null; Expression <Func <MixModuleProduct, bool> > productExp = null; switch (Type) { case MixModuleType.Content: case MixModuleType.Data: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; //articleExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; //productExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; break; case MixModuleType.SubPage: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture && (m.CategoryId == categoryId); articleExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; productExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; break; case MixModuleType.SubArticle: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture && (m.ArticleId == articleId); break; case MixModuleType.SubProduct: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture && (m.ProductId == productId); break; case MixModuleType.ListArticle: articleExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; case MixModuleType.ListProduct: productExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; default: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; articleExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; productExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; break; } if (dataExp != null) { var getDataResult = MixModuleDatas.ReadViewModel.Repository .GetModelListBy( dataExp , MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.OrderBy), 0 , pageSize, pageIndex , _context: context, _transaction: transaction); if (getDataResult.IsSucceed) { getDataResult.Data.JsonItems = new List <JObject>(); getDataResult.Data.Items.ForEach(d => getDataResult.Data.JsonItems.Add(d.JItem)); Data = getDataResult.Data; } } if (articleExp != null) { var getArticles = MixModuleArticles.ReadViewModel.Repository .GetModelListBy(articleExp , MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.OrderBy), 0 , pageSize, pageIndex , _context: context, _transaction: transaction); if (getArticles.IsSucceed) { Articles = getArticles.Data; } } if (productExp != null) { var getProducts = MixModuleProducts.ReadViewModel.Repository .GetModelListBy(productExp , MixService.GetConfig <string>(MixConstants.ConfigurationKeyword.OrderBy), 0 , PageSize, pageIndex , _context: context, _transaction: transaction); if (getProducts.IsSucceed) { Products = getProducts.Data; } } } catch (Exception ex) { UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <ReadMvcViewModel> >(ex, isRoot, transaction); } finally { if (isRoot) { //if current Context is Root context.Dispose(); } } }
private async Task <RepositoryResponse <bool> > ImportPagesAsync(string destCulture, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { int startId = MixPages.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data + 1; //var pages = FileRepository.Instance.GetFile(MixConstants.CONST_FILE_PAGES, "data", true, "{}"); //var obj = JObject.Parse(pages.Content); //var initPages = obj["data"].ToObject<JArray>(); foreach (var item in Pages) { // store old id => update to related data if save success var oldId = item.Id; item.Id = startId; item.CreatedDateTime = DateTime.UtcNow; item.ThemeName = ThemeName; //if (_context.MixPage.Any(m=>m.Id == startId)) //(item.Id > initPages.Count) //{ // item.Id = _context.MixPage.Max(m => m.Id) + 1; // item.CreatedDateTime = DateTime.UtcNow; //} if (!string.IsNullOrEmpty(item.Image)) { item.Image = item.Image.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", destCulture)}"); } if (!string.IsNullOrEmpty(item.Thumbnail)) { item.Thumbnail = item.Thumbnail.Replace($"content/templates/{ThemeName}", $"content/templates/{MixService.GetConfig<string>("ThemeFolder", destCulture)}"); } item.Specificulture = destCulture; var saveResult = await item.SaveModelAsync(true, context, transaction); if (!saveResult.IsSucceed) { result.IsSucceed = false; result.Exception = saveResult.Exception; result.Errors = saveResult.Errors; break; } else { // update new id to related attribute data var related = RelatedData.Where( m => m.ParentType == (int)MixEnums.MixAttributeSetDataType.Page && m.ParentId == oldId.ToString()); foreach (var r in related) { r.ParentId = item.Id.ToString(); } startId++; } } UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { var error = UnitOfWorkHelper <MixCmsContext> .HandleException <MixPages.ImportViewModel>(ex, isRoot, transaction); result.IsSucceed = false; result.Errors = error.Errors; result.Exception = error.Exception; } finally { //if current Context is Root if (isRoot) { context?.Dispose(); } } return(result); }
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(); } } }
//public override List<Task> GenerateRelatedData(MixCmsContext context, IDbContextTransaction transaction) //{ // var tasks = new List<Task>(); // tasks.Add(Task.Run(() => // { // AttributeData.Data.RemoveCache(AttributeData.Data.Model, context, transaction); // })); // foreach (var item in AttributeData.Data.Values) // { // tasks.Add(Task.Run(() => // { // item.RemoveCache(item.Model, context, transaction); // })); // } // // Remove parent Pages // var relatedPages = context.MixPageModule.Include(m => m.MixPage).Where(d => d.Specificulture == Specificulture && (d.ModuleId == Id)) // .AsEnumerable(); // foreach (var item in relatedPages) // { // tasks.Add(Task.Run(() => // { // MixPageModules.ReadMvcViewModel.Repository.RemoveCache(item, context, transaction); // })); // tasks.Add(Task.Run(() => // { // MixPages.ReadViewModel.Repository.RemoveCache(item.MixPage, context, transaction); // })); // } // return tasks; //} #endregion Async #endregion Overrides #region Expand public static async Task <RepositoryResponse <JObject> > SaveByModuleName(string culture, string createdBy, string name, string formName, JObject obj , MixCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { var getModule = await Repository.GetSingleModelAsync(m => m.Specificulture == culture && m.Name == name, context, transaction); string dataId = obj["id"]?.Value <string>(); if (getModule.IsSucceed) { // Get Attribute set var getAttrSet = await Lib.ViewModels.MixAttributeSets.ReadViewModel.Repository.GetSingleModelAsync(m => m.Name == formName, context, transaction); if (getAttrSet.IsSucceed) { // Save attr data + navigation MixAttributeSetDatas.UpdateViewModel data = new MixAttributeSetDatas.UpdateViewModel() { Id = dataId, CreatedBy = createdBy, AttributeSetId = getAttrSet.Data.Id, AttributeSetName = getAttrSet.Data.Name, Specificulture = culture, Data = obj }; // Create navigation module - attr data var getNavigation = await MixRelatedAttributeDatas.ReadViewModel.Repository.GetSingleModelAsync( m => m.ParentId == getModule.Data.Id.ToString() && m.ParentType == MixEnums.MixAttributeSetDataType.Module.ToString() && m.Specificulture == culture , context, transaction); if (!getNavigation.IsSucceed) { data.RelatedData.Add(new MixRelatedAttributeDatas.UpdateViewModel() { ParentId = getModule.Data.Id.ToString(), Specificulture = culture, ParentType = MixAttributeSetDataType.Module }); } var portalResult = await data.SaveModelAsync(true, context, transaction); UnitOfWorkHelper <MixCmsContext> .HandleTransaction(portalResult.IsSucceed, isRoot, transaction); return(new RepositoryResponse <JObject>() { IsSucceed = portalResult.IsSucceed, Data = portalResult.Data?.Data, Exception = portalResult.Exception, Errors = portalResult.Errors }); } else { return(new RepositoryResponse <JObject>() { IsSucceed = false, Status = (int)MixEnums.ResponseStatus.BadRequest }); } } else { return(new RepositoryResponse <JObject>() { IsSucceed = false, Status = (int)MixEnums.ResponseStatus.BadRequest }); } } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <JObject>(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> > > SearchPosts <TView>( SearchPostQueryModel searchPostData, MixCmsContext _context = null, IDbContextTransaction _transaction = null) where TView : ViewModelBase <MixCmsContext, MixPost, TView> { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { Expression <Func <MixDatabaseDataValue, bool> > valPredicate = null; Expression <Func <MixDatabaseDataValue, bool> > catePredicate = GetCategoryPredicate(searchPostData); Expression <Func <MixDatabaseDataValue, bool> > tagPredicate = GetTagPredicate(searchPostData); Expression <Func <MixDatabaseDataValue, bool> > queryPredicate = GetQueryPredicate(searchPostData); valPredicate = valPredicate .AndAlsoIf(queryPredicate != null, queryPredicate) .AndAlsoIf(catePredicate != null, catePredicate) .AndAlsoIf(tagPredicate != null, tagPredicate); if (valPredicate != null) { return(await SearchPostByValue <TView>(valPredicate, searchPostData, context, transaction)); } else { Expression <Func <MixPost, bool> > predicate = BuildPostExpression(searchPostData); if (searchPostData.PagingData.OrderBy.StartsWith("additionalData.")) { return(GetSortedPostByValue <TView>(predicate, searchPostData, context, transaction)); } if (searchPostData.PageId.HasValue) { return(GetSortedPostByPage <TView>(predicate, searchPostData, context, transaction)); } return(await DefaultRepository <MixCmsContext, MixPost, TView> .Instance.GetModelListByAsync( predicate, searchPostData.PagingData.OrderBy, searchPostData.PagingData.Direction, searchPostData.PagingData.PageSize, searchPostData.PagingData.PageIndex, null, null, context, transaction)); } } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <TView> >(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }