public static RepositoryResponse <List <MixPagePosts.ReadViewModel> > GetNavAsync(int postId, string specificulture , MixCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { var navCategoryPostViewModels = context.MixPage.Include(cp => cp.MixPagePost).Where(a => a.Specificulture == specificulture && (a.Type == MixPageType.ListPost) ) .AsEnumerable() .Select(p => new MixPagePosts.ReadViewModel( new MixPagePost() { PostId = postId, PageId = p.Id, Specificulture = specificulture }, _context, _transaction) { IsActived = p.MixPagePost.Any(cp => cp.PostId == postId && cp.Specificulture == specificulture), Description = p.Title }); return(new RepositoryResponse <List <ReadViewModel> >() { IsSucceed = true, Data = navCategoryPostViewModels.ToList() }); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { if (isRoot) { transaction.Rollback(); } return(new RepositoryResponse <List <MixPagePosts.ReadViewModel> >() { IsSucceed = true, Data = null, Exception = ex }); } finally { if (isRoot) { //if current Context is Root transaction.Dispose(); UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
private static Expression <Func <MixPost, bool> > SearchPostByPageIdsPredicate(List <int> pageIds, string culture, MixCmsContext context) { Expression <Func <MixPost, bool> > postPredicate = null; Expression <Func <MixPagePost, bool> > predicate = null; foreach (var id in pageIds) { // Get list related post ids by data id Expression <Func <MixPagePost, bool> > pre = m => m.Specificulture == culture && m.Status == MixContentStatus.Published && m.PageId == id; predicate = predicate == null ? pre : predicate.Or(pre); } if (predicate != null) { var postIds = context.MixPagePost .Where(predicate) .Select(m => m.PostId).Distinct(); postPredicate = p => postIds.Any(m => m == p.Id); } return(postPredicate); }
public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPostByField <TView>( string fieldName, string value , string culture = null , 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 { culture ??= MixService.GetConfig <string>(MixAppSettingKeywords.DefaultCulture); 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.MixDatabaseDataValue.Where( m => m.MixDatabaseName == MixConstants.MixDatabaseName.ADDITIONAL_FIELD_POST && m.Specificulture == culture && EF.Functions.Like(m.StringValue, value) && m.MixDatabaseColumnName == fieldName) .Select(m => m.DataId)?.ToListAsync(); if (dataIds != null && dataIds.Count > 0) { var getRelatedData = await MixDatabaseDataAssociations.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 UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
public RepositoryResponse <bool> Validate <T>(IConvertible id, string specificulture, JObject jItem, MixCmsContext _context = null, IDbContextTransaction _transaction = null) where T : class { string val = jItem[Name]["value"].Value <string>(); var jVal = new JProperty(Name, jItem[Name]); var result = new RepositoryResponse <bool>() { IsSucceed = true }; if (IsUnique) { //string query = @"SELECT * FROM [Mix_module_data] WHERE JSON_VALUE([Value],'$.{0}.value') = '{1}'"; // AND Specificulture = '{2}' AND Id <> '{3}' //var temp = string.Format(query, Name, val);//, specificulture, id?.ToString() //int count = _context.MixModuleData.FromSql(query, Name, val).Count(d=>d.Specificulture == specificulture && d.Id != id.ToString());//, specificulture, id?.ToString() //string query = $"SELECT * FROM Mix_module_data WHERE JSON_VALUE([Value],'$.{Name}.value') = '{val}' AND Specificulture = '{specificulture}' AND Id != '{id}'"; //int count = _context.MixModuleData.FromSql(sql: new RawSqlString(query)).Count(); var strId = id?.ToString(); int count = _context.MixModuleData.Count(d => d.Specificulture == specificulture && d.Value.Contains(jVal.ToString(Formatting.None)) && d.Id != strId); if (count > 0) { result.IsSucceed = false; result.Errors.Add($"{Title} is existed"); } } if (IsRequired) { if (string.IsNullOrEmpty(val)) { result.IsSucceed = false; result.Errors.Add($"{Title} is required"); } } return(result); }
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 <MixDatabaseDataAssociation, bool> > predicate = m => m.Specificulture == culture && dataIds.Contains(m.DataId) && m.ParentType == MixDatabaseParentType.Post; foreach (var id in dataIds) { Expression <Func <MixDatabaseDataAssociation, bool> > pre = m => m.DataId == id; predicate = predicate.AndAlso(pre); } var getRelatedData = await MixDatabaseDataAssociations.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 UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
/// <summary> /// Step 2 /// - Init Configurations /// </summary> /// <param name="siteName"></param> /// <param name="specifiCulture"></param> /// <param name="_context"></param> /// <param name="_transaction"></param> /// <returns></returns> public static async Task <RepositoryResponse <bool> > InitAttributeSetsAsync(string siteName, string specifiCulture, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { /* Init Configs */ UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); var result = new RepositoryResponse <bool>() { IsSucceed = true }; var getData = FileRepository.Instance.GetFile(MixConstants.CONST_FILE_ATTRIBUTE_SETS, "data", true, "{}"); var obj = JObject.Parse(getData.Content); var data = obj["data"].ToObject <List <ViewModels.MixAttributeSets.UpdateViewModel> >(); foreach (var item in data) { if (result.IsSucceed) { item.CreatedDateTime = DateTime.UtcNow; var saveResult = await item.SaveModelAsync(true, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } else { break; } } UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); return(result); }
private async Task <bool> InitConfigurationsAsync(string siteName, InitCulture culture, MixCmsContext context, IDbContextTransaction transaction) { /* Init Configs */ var configurations = FileRepository.Instance.GetFile(MixConstants.CONST_FILE_CONFIGURATIONS, "data", true, "{}"); var obj = JObject.Parse(configurations.Content); var arrConfiguration = obj["data"].ToObject <List <MixConfiguration> >(); if (!string.IsNullOrEmpty(siteName)) { arrConfiguration.Find(c => c.Keyword == "SiteName").Value = siteName; arrConfiguration.Find(c => c.Keyword == "ThemeName").Value = siteName; arrConfiguration.Find(c => c.Keyword == "ThemeFolder").Value = Common.Helper.SeoHelper.GetSEOString(siteName); } var result = await ViewModels.MixConfigurations.ReadMvcViewModel.ImportConfigurations(arrConfiguration, culture.Specificulture, context, transaction); return(result.IsSucceed); }
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 && MixDatabases != null && MixDatabases.Count > 0) { result = await ImportMixDatabasesAsync(context, transaction); } if (result.IsSucceed && MixDatabaseDatas.Count > 0) { result = await ImportMixDatabaseDatas(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); }
private async Task <RepositoryResponse <bool> > ImportModulesAsync(string destCulture, MixCmsContext context, IDbContextTransaction transaction) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; var startId = context.MixModule.Any() ? context.MixModule.Max(m => m.Id) : 0; foreach (var module in Modules) { var oldId = module.Id; module.CreatedBy = CreatedBy; if (result.IsSucceed) { if (!context.MixModule.Any(m => m.Name == module.Name && m.Specificulture == destCulture)) { startId++; module.Id = startId; module.Specificulture = destCulture; module.CreatedDateTime = DateTime.UtcNow; var saveResult = await module.SaveModelAsync(false, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } if (!dicModuleIds.Any(m => m.Key == oldId)) { // update new id to related attribute data dicModuleIds.Add(oldId, module.Id); } } else { break; } } return(result); }
public static async Task <RepositoryResponse <AdditionalViewModel> > GetAdditionalData( MixDatabaseParentType 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 && 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 = 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); } } }
private void ExportDatas(MixCmsContext context, IDbContextTransaction transaction) { ExportMixDatabaseData(context, transaction); ExportRelatedDatas(context, transaction); }
public static async Task <RepositoryResponse <PaginationModel <TView> > > FilterByKeywordAsync <TView>(HttpRequest request, string culture = null, string attributeSetName = 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 { culture = culture ?? MixService.GetConfig <string>("DefaultCulture"); var queryDictionary = request.Query.ToList(); attributeSetName = 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); var isPageSize = 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 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(); // Data predicate Expression <Func <MixAttributeSetData, bool> > predicate = m => m.Specificulture == culture && (m.AttributeSetName == attributeSetName); // val predicate Expression <Func <MixAttributeSetValue, bool> > attrPredicate = m => m.Specificulture == culture && (m.AttributeSetName == attributeSetName); 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)) { Expression <Func <MixAttributeSetValue, bool> > pre = null; foreach (var field in fields) { Expression <Func <MixAttributeSetValue, bool> > keywordPredicate = m => m.AttributeFieldName == field.Name; keywordPredicate = keywordPredicate.AndAlsoIf(filterType == "equal", m => m.StringValue == keyword); keywordPredicate = keywordPredicate.AndAlsoIf(filterType == "contain", m => EF.Functions.Like(m.StringValue, $"%{keyword}%")); pre = pre == null ? keywordPredicate : pre.Or(keywordPredicate); } attrPredicate = attrPredicate.AndAlsoIf(pre != null, pre); } if (fieldQueries != null && fieldQueries.Properties().Count() > 0) // filter by specific field name { var valPredicate = GetFilterValueByFields(fields, fieldQueries, filterType); attrPredicate.AndAlsoIf(valPredicate != null, valPredicate); } var query = context.MixAttributeSetValue.Where(attrPredicate).Select(m => m.DataId).Distinct(); var dataIds = query.ToList(); predicate = predicate.AndAlsoIf(query != null, m => dataIds.Any(id => m.Id == id)); } else { predicate = m => m.Specificulture == culture && (m.AttributeSetId == attributeSetId || m.AttributeSetName == attributeSetName) && (!isStatus || (m.Status == status)) && (!isFromDate || (m.CreatedDateTime >= fromDate)) && (!isToDate || (m.CreatedDateTime <= toDate)); } result = await DefaultRepository <MixCmsContext, MixAttributeSetData, TView> .Instance.GetModelListByAsync( predicate, orderBy, direction, isPageSize?pageSize : default, isPageSize?pageIndex : 0, null, null, context, transaction);
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()); valPredicate = valPredicate == null ? pre : valPredicate = valPredicate.AndAlso(pre); } else { Expression <Func <MixAttributeSetValue, bool> > pre = m => m.AttributeFieldName == q.Key && (EF.Functions.Like(m.StringValue, $"%{q.Value}%")); valPredicate = valPredicate == null ? pre : valPredicate = valPredicate.AndAlso(pre); } } } if (valPredicate != null) { attrPredicate = valPredicate.AndAlso(attrPredicate); } } // 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 = attrPredicate.AndAlso(pre); } 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 UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
async Task <RepositoryResponse <bool> > HandlePermission(MixPortalPages.UpdateRolePermissionViewModel item, MixCmsContext context, IDbContextTransaction transaction) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; if (item.NavPermission.IsActived) { item.NavPermission.CreatedBy = item.CreatedBy; var saveResult = await item.NavPermission.SaveModelAsync(false, context, transaction); result.IsSucceed = saveResult.IsSucceed; /* skip child nav * if (result.IsSucceed) * { * foreach (var child in item.ChildPages) * { * result = await HandlePermission(child.Page, context, transaction); * if (!result.IsSucceed) * { * break; * } * } * }*/ if (!result.IsSucceed) { result.Exception = saveResult.Exception; Errors.AddRange(saveResult.Errors); } } else { var saveResult = await item.NavPermission.RemoveModelAsync(false, context, transaction); /* skip child nav */ result.IsSucceed = saveResult.IsSucceed; if (result.IsSucceed) { foreach (var child in item.ChildPages) { child.Page.NavPermission.IsActived = false; result = await HandlePermission(child.Page, context, transaction); } } if (!result.IsSucceed) { result.Exception = saveResult.Exception; Errors.AddRange(saveResult.Errors); } } return(result); }
public static async Task <RepositoryResponse <bool> > InitSiteData(string siteName, InitCulture culture) { RepositoryResponse <bool> result = new RepositoryResponse <bool>(); MixCmsContext context = null; IDbContextTransaction transaction = null; bool isSucceed = true; try { if (!string.IsNullOrEmpty(MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION))) { context = MixService.GetDbContext(); transaction = context.Database.BeginTransaction(); var countCulture = context.MixCulture.Count(); /** * Init Selected Language as default */ isSucceed = InitCultures(culture, context, transaction); /** * Init System Configurations */ if (isSucceed && context.MixConfiguration.Count() == 0) { var saveResult = await InitConfigurationsAsync(siteName, culture.Specificulture, context, transaction); result.IsSucceed = saveResult.IsSucceed; result.Errors = saveResult.Errors; result.Exception = saveResult.Exception; } else { result.IsSucceed = false; result.Errors.Add("Cannot init cultures"); } if (result.IsSucceed) { transaction.Commit(); } else { transaction.Rollback(); } } return(result); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { transaction?.Rollback(); result.IsSucceed = false; result.Exception = ex; return(result); } finally { context?.Database.CloseConnection(); context?.Dispose(); } }
private async Task <RepositoryResponse <bool> > ImportPostsAsync(string destCulture, MixCmsContext context, IDbContextTransaction transaction) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; var startId = context.MixPost.Any() ? context.MixPost.Max(m => m.Id) : 0; foreach (var post in Posts) { var oldId = post.Id; post.CreatedBy = CreatedBy; if (result.IsSucceed) { if (!context.MixPost.Any(m => m.SeoName == post.SeoName && m.Specificulture == destCulture)) { startId++; post.Id = startId; post.Specificulture = destCulture; post.CreatedDateTime = DateTime.UtcNow; var saveResult = await post.SaveModelAsync(true, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } // update new id to related attribute data if (!dicPostIds.Any(m => m.Key == oldId)) { dicPostIds.Add(oldId, post.Id); } } else { break; } } return(result); }
/// <summary> /// Step 2 /// - Init Configurations /// </summary> /// <param name="siteName"></param> /// <param name="specifiCulture"></param> /// <param name="_context"></param> /// <param name="_transaction"></param> /// <returns></returns> public static async Task <RepositoryResponse <bool> > InitConfigurationsAsync(string siteName, string specifiCulture, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { /* Init Configs */ UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); var getConfigs = FileRepository.Instance.GetFile(MixConstants.CONST_FILE_CONFIGURATIONS, "data", true, "{}"); var obj = JObject.Parse(getConfigs.Content); var configurations = obj["data"].ToObject <List <MixConfiguration> >(); var cnfSiteName = configurations.Find(c => c.Keyword == "SiteName"); cnfSiteName.Value = siteName; if (!string.IsNullOrEmpty(cnfSiteName.Value)) { configurations.Find(c => c.Keyword == "ThemeName").Value = Common.Helper.SeoHelper.GetSEOString(cnfSiteName.Value); configurations.Find(c => c.Keyword == "ThemeFolder").Value = Common.Helper.SeoHelper.GetSEOString(cnfSiteName.Value); } var result = await ViewModels.MixConfigurations.ReadMvcViewModel.ImportConfigurations(configurations, specifiCulture, context, transaction); UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); return(result); }
private async Task <RepositoryResponse <bool> > ImportMixDatabasesAsync(MixCmsContext context, IDbContextTransaction transaction) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; if (MixDatabases != null) { var startId = ViewModels.MixDatabases.ImportViewModel.Repository.Max(m => m.Id, context, transaction).Data; var startFieldId = MixDatabaseColumns.UpdateViewModel.Repository.Max(m => m.Id, context, transaction).Data; var mixDatabaseColumns = new List <MixDatabaseColumns.UpdateViewModel>(); foreach (var set in MixDatabases) { set.CreatedBy = CreatedBy; if (result.IsSucceed) { if (!context.MixDatabase.Any(m => m.Name == set.Name)) { startId++; set.Id = startId; set.CreatedDateTime = DateTime.UtcNow; mixDatabaseColumns.AddRange(set.Fields .Where(m => !mixDatabaseColumns.Any(n => n.Id == m.Id)) .ToList()); var saveResult = await set.SaveModelAsync(false, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } if (!dicMixDatabaseIds.Any(m => m.Key == set.Id)) { dicMixDatabaseIds.Add(set.Id, startId); } } else { break; } } // save fields if (result.IsSucceed) { foreach (var field in mixDatabaseColumns) { if (result.IsSucceed) { field.CreatedBy = CreatedBy; var setId = dicMixDatabaseIds.FirstOrDefault(m => m.Key == field.MixDatabaseId); field.MixDatabaseId = setId.Value; if (field.ReferenceId != null) { var refId = dicMixDatabaseIds.FirstOrDefault(m => m.Key == field.ReferenceId); field.ReferenceId = refId.Value; } if (dicFieldIds.ContainsKey(field.Id)) { field.Id = dicFieldIds[field.Id]; field.CreatedDateTime = DateTime.UtcNow; } else { startFieldId++; dicFieldIds.Add(field.Id, startFieldId); field.Id = startFieldId; field.CreatedDateTime = DateTime.UtcNow; } var saveResult = await field.SaveModelAsync(false, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } else { result.Errors.Add($"Cannot Import {field.Name} - {field.Id}"); break; } } } } return(result); }
/// <summary> /// Step 1 /// - Init Culture /// - Init System pages /// </summary> /// <param name="siteName"></param> /// <param name="culture"></param> /// <returns></returns> public static async Task <RepositoryResponse <bool> > InitCms(string siteName, InitCulture culture) { RepositoryResponse <bool> result = new RepositoryResponse <bool>(); MixCmsContext context = null; MixCmsAccountContext accountContext = null; MixChatServiceContext messengerContext; IDbContextTransaction transaction = null; IDbContextTransaction accTransaction = null; bool isSucceed = true; try { if (!string.IsNullOrEmpty(MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION))) { context = new MixCmsContext(); accountContext = new MixCmsAccountContext(); messengerContext = new MixChatServiceContext(); await context.Database.MigrateAsync(); await accountContext.Database.MigrateAsync(); await messengerContext.Database.MigrateAsync(); transaction = context.Database.BeginTransaction(); var countCulture = context.MixCulture.Count(); var isInit = MixService.GetConfig <bool>("IsInit"); if (!isInit) { /** * Init Selected Language as default */ isSucceed = InitCultures(culture, context, transaction); /** * Init System Pages */ if (isSucceed) { InitPages(culture.Specificulture, context, transaction); isSucceed = (await context.SaveChangesAsync().ConfigureAwait(false)) > 0; } else { result.Errors.Add("Cannot init Pages"); } /** * Init System Positions */ if (isSucceed) { isSucceed = await InitPositionsAsync(context, transaction); } else { result.Errors.Add("Cannot init Positions"); } /** * Init System Configurations */ if (isSucceed) { var saveResult = await InitConfigurationsAsync(siteName, culture.Specificulture, context, transaction); isSucceed = saveResult.IsSucceed; } else { result.Errors.Add("Cannot init Configurations"); } /** * Init System Attribute Sets */ if (isSucceed) { var saveResult = await InitAttributeSetsAsync(siteName, culture.Specificulture, context, transaction); isSucceed = saveResult.IsSucceed; } else { result.Errors.Add("Cannot init Attribute Sets"); } } if (isSucceed) { transaction.Commit(); } else { transaction.Rollback(); } } result.IsSucceed = isSucceed; return(result); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { transaction?.Rollback(); accTransaction?.Rollback(); result.IsSucceed = false; result.Exception = ex; return(result); } finally { context?.Dispose(); accountContext?.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 = 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 async Task <RepositoryResponse <bool> > InitCms(string siteName, InitCulture culture) { RepositoryResponse <bool> result = new RepositoryResponse <bool>(); MixCmsContext context = null; MixCmsAccountContext accountContext = null; MixChatServiceContext messengerContext; IDbContextTransaction transaction = null; IDbContextTransaction accTransaction = null; bool isSucceed = true; try { if (!string.IsNullOrEmpty(MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION))) { context = new MixCmsContext(); accountContext = new MixCmsAccountContext(); messengerContext = new MixChatServiceContext(); //MixChatServiceContext._cnn = MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION); await context.Database.MigrateAsync(); await accountContext.Database.MigrateAsync(); await messengerContext.Database.MigrateAsync(); transaction = context.Database.BeginTransaction(); var countCulture = context.MixCulture.Count(); var isInit = countCulture > 0; if (!isInit) { MixService.SetConfig <string>("SiteName", siteName); isSucceed = InitCultures(culture, context, transaction); isSucceed = isSucceed && InitPositions(context, transaction); isSucceed = isSucceed && await InitConfigurationsAsync(siteName, culture, context, transaction); isSucceed = isSucceed && await InitLanguagesAsync(culture, context, transaction); isSucceed = isSucceed && InitThemes(siteName, context, transaction); } else { isSucceed = true; } if (isSucceed && context.MixPage.Count() == 0) { var cate = new MixPage() { Id = 1, Level = 0, Title = "Home", Specificulture = culture.Specificulture, Template = "Pages/_Home.cshtml", Type = (int)MixPageType.Home, CreatedBy = "Admin", CreatedDateTime = DateTime.UtcNow, Status = (int)PageStatus.Published }; context.Entry(cate).State = EntityState.Added; var alias = new MixUrlAlias() { Id = 1, SourceId = "1", Type = (int)UrlAliasType.Page, Specificulture = culture.Specificulture, CreatedDateTime = DateTime.UtcNow, Alias = cate.Title.ToLower() }; context.Entry(alias).State = EntityState.Added; var createVNHome = await context.SaveChangesAsync().ConfigureAwait(false); isSucceed = createVNHome > 0; var cate404 = new MixPage() { Id = 2, Title = "404", Level = 0, Specificulture = culture.Specificulture, Template = "Pages/_404.cshtml", Type = (int)MixPageType.Article, CreatedBy = "Admin", CreatedDateTime = DateTime.UtcNow, Status = (int)PageStatus.Published }; var alias404 = new MixUrlAlias() { Id = 2, SourceId = "2", Type = (int)UrlAliasType.Page, Specificulture = culture.Specificulture, CreatedDateTime = DateTime.UtcNow, Alias = cate404.Title.ToLower() }; context.Entry(cate404).State = EntityState.Added; context.Entry(alias404).State = EntityState.Added; var create404 = await context.SaveChangesAsync().ConfigureAwait(false); isSucceed = create404 > 0; } if (isSucceed) { transaction.Commit(); } else { transaction.Rollback(); } } result.IsSucceed = isSucceed; return(result); } catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only { transaction?.Rollback(); accTransaction?.Rollback(); result.IsSucceed = false; result.Exception = ex; return(result); } finally { context?.Dispose(); accountContext?.Dispose(); } }
private async Task <RepositoryResponse <bool> > ImportMixDatabaseDatas(string destCulture, MixCmsContext context, IDbContextTransaction transaction) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; foreach (var item in MixDatabaseDatas) { item.CreatedBy = CreatedBy; if (result.IsSucceed) { item.CreatedBy = CreatedBy; if (!context.MixDatabaseData.Any(m => m.Id == item.Id && m.Specificulture == item.Specificulture)) { item.Specificulture = destCulture; item.CreatedDateTime = DateTime.UtcNow; // update new Id if not system attribute if (item.MixDatabaseName.IndexOf("sys_") != 0 && dicMixDatabaseIds.ContainsKey(item.MixDatabaseId)) { item.MixDatabaseId = dicMixDatabaseIds[item.MixDatabaseId]; } item.Fields = item.Fields ?? MixDatabaseColumns.UpdateViewModel.Repository.GetModelListBy( m => m.MixDatabaseId == item.MixDatabaseId, context, transaction).Data; foreach (var field in item.Fields) { field.Specificulture = destCulture; var newSet = MixDatabases.FirstOrDefault(m => m.Name == field.MixDatabaseName); var newField = newSet?.Fields.FirstOrDefault(m => m.Name == field.Name); if (newField != null) { field.Id = newField.Id; field.MixDatabaseId = newSet.Id; field.MixDatabaseName = newSet.Name; field.CreatedDateTime = DateTime.UtcNow; } } var saveResult = await item.SaveModelAsync(true, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } } else { break; } } return(result); }
private static async Task <RepositoryResponse <MixConfigurations.UpdateViewModel> > SaveNewConfigAsync(string keyword, string value, string culture, MixCmsContext context, IDbContextTransaction transaction) { MixConfigurations.UpdateViewModel config = (await MixConfigurations.UpdateViewModel.Repository.GetSingleModelAsync( c => c.Keyword == keyword && c.Specificulture == culture , context, transaction)).Data; if (config == null) { config = new MixConfigurations.UpdateViewModel() { Keyword = keyword, Specificulture = culture, Category = "Site", DataType = MixDataType.Text, Description = "Cms Theme", Value = value }; } else { config.Property.Value = value; } return(await config.SaveModelAsync(false, context, transaction)); }
private async Task <RepositoryResponse <bool> > ImportRelatedDatas(string desCulture, MixCmsContext context, IDbContextTransaction transaction) { var result = await ImportRelatedMixDatabaseDatas(desCulture, context, transaction); if (result.IsSucceed) { result = await ImportPagePostNavs(desCulture, context, transaction); } if (result.IsSucceed) { result = await ImportPageModuleNavs(desCulture, context, transaction); } if (result.IsSucceed) { result = await ImportModulePostNavs(desCulture, context, transaction); } return(result); }
public static async Task <RepositoryResponse <PaginationModel <TView> > > SearchPostByIds <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.MixDatabaseDataAssociation.Where( m => m.Specificulture == culture && postIds.Any(p => p.ToString() == m.ParentId)) .Join(context.MixDatabaseDataValue, 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); } } }
private async Task <RepositoryResponse <bool> > ImportModuleDatas(string desCulture, MixCmsContext context, IDbContextTransaction transaction) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; foreach (var item in ModuleDatas) { item.CreatedBy = CreatedBy; if (result.IsSucceed) { item.Specificulture = desCulture; item.ModuleId = dicModuleIds[item.ModuleId]; item.CreatedDateTime = DateTime.UtcNow; var saveResult = await item.SaveModelAsync(false, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } else { break; } } return(result); }
private static Expression <Func <MixPost, bool> > SearchPostByDataIdsPredicate(List <string> dataIds, string culture, MixCmsContext context) { Expression <Func <MixPost, bool> > postPredicate = null; Expression <Func <MixDatabaseDataAssociation, bool> > predicate = null; foreach (var id in dataIds) { // Get list related post ids by data id Expression <Func <MixDatabaseDataAssociation, bool> > pre = m => m.Specificulture == culture && m.ParentType == MixDatabaseParentType.Post && m.DataId == id; predicate = predicate == null ? pre : predicate.AndAlso(pre); } if (predicate != null) { var postIds = context.MixDatabaseDataAssociation .Where(predicate) .Select(m => m.ParentId).Distinct(); postPredicate = p => postIds.Any(m => p.Id.ToString() == m); } return(postPredicate); }
private async Task <RepositoryResponse <bool> > ImportRelatedMixDatabaseDatas(string desCulture, MixCmsContext context, IDbContextTransaction transaction) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; foreach (var item in RelatedData) { item.CreatedBy = CreatedBy; item.Id = Guid.NewGuid().ToString(); item.Specificulture = desCulture; switch (item.ParentType) { case MixDatabaseParentType.Set: item.MixDatabaseId = dicMixDatabaseIds[item.MixDatabaseId]; break; case MixDatabaseParentType.Post: break; case MixDatabaseParentType.Page: if (dicPageIds.TryGetValue(int.Parse(item.ParentId), out int pageId)) { item.ParentId = pageId.ToString(); } else { continue; } break; case MixDatabaseParentType.Module: if (dicModuleIds.TryGetValue(int.Parse(item.ParentId), out int moduleId)) { item.ParentId = moduleId.ToString(); } else { continue; } break; default: break; } if (result.IsSucceed) { var saveResult = await item.SaveModelAsync(false, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } else { break; } } return(result); }
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 MixDatabaseDataValues.ReadViewModel.Repository.GetSingleModelAsync( m => m.Specificulture == culture && m.Status == MixContentStatus.Published && 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.MixDatabaseDataType.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); } } }
private static Expression <Func <MixPost, bool> > SearchPostByDataIdsPredicate(List <string> dataIds, List <string> nestedIds, string culture, MixCmsContext context) { Expression <Func <MixPost, bool> > postPredicate = null; Expression <Func <MixDatabaseDataAssociation, bool> > predicate = m => m.ParentType == MixDatabaseParentType.Post && m.Specificulture == culture; if (nestedIds != null && nestedIds.Count > 0) { var nestedQuery = context.MixDatabaseDataAssociation .Where(m => m.Specificulture == culture && nestedIds.Any(n => n == m.DataId)) .Select(m => m.ParentId).Distinct(); dataIds.AddRange(nestedQuery); } if (dataIds.Count > 0) { predicate = predicate.AndAlso(m => dataIds.Any(n => n == m.DataId)); var postIds = context.MixDatabaseDataAssociation .Where(predicate) .GroupBy(m => m.ParentId) .Select(g => new { ParentId = g.Key, Count = g.Count() }) .Where(c => c.Count == dataIds.Count) .Select(m => m.ParentId); postPredicate = p => postIds.Any(m => p.Id.ToString() == m); } return(postPredicate); }