private async Task Sync(DataContext context, string json) { List <EventMessage <ProductGrouping> > EventMessageReceived = JsonConvert.DeserializeObject <List <EventMessage <ProductGrouping> > >(json); await SaveEventMessage(context, SyncKey, EventMessageReceived); List <Guid> RowIds = EventMessageReceived.Select(a => a.RowId).Distinct().ToList(); List <EventMessage <ProductGrouping> > ProductGroupingEventMessages = await ListEventMessage <ProductGrouping>(context, SyncKey, RowIds); List <ProductGrouping> ProductGroupings = ProductGroupingEventMessages.Select(x => x.Content).ToList(); List <ProductGroupingDAO> ProductGroupingInDB = await context.ProductGrouping.ToListAsync(); try { List <ProductGroupingDAO> ProductGroupingDAOs = new List <ProductGroupingDAO>(); foreach (ProductGrouping ProductGrouping in ProductGroupings) { ProductGroupingDAO ProductGroupingDAO = ProductGroupingInDB.Where(x => x.Id == ProductGrouping.Id).FirstOrDefault(); if (ProductGroupingDAO == null) { ProductGroupingDAO = new ProductGroupingDAO(); } ProductGroupingDAO.Id = ProductGrouping.Id; ProductGroupingDAO.Code = ProductGrouping.Code; ProductGroupingDAO.CreatedAt = ProductGrouping.CreatedAt; ProductGroupingDAO.UpdatedAt = ProductGrouping.UpdatedAt; ProductGroupingDAO.DeletedAt = ProductGrouping.DeletedAt; ProductGroupingDAO.Id = ProductGrouping.Id; ProductGroupingDAO.Name = ProductGrouping.Name; ProductGroupingDAO.RowId = ProductGrouping.RowId; ProductGroupingDAO.Description = ProductGrouping.Description; ProductGroupingDAO.Level = ProductGrouping.Level; ProductGroupingDAO.ParentId = ProductGrouping.ParentId; ProductGroupingDAO.Path = ProductGrouping.Path; ProductGroupingDAOs.Add(ProductGroupingDAO); } await context.BulkMergeAsync(ProductGroupingDAOs); } catch (Exception ex) { Log(ex, nameof(ProductGroupingHandler)); } }
private IQueryable <ItemDAO> DynamicFilter(IQueryable <ItemDAO> query, ItemFilter filter) { if (filter == null) { return(query.Where(q => false)); } query = query.Where(q => q.DeletedAt == null && q.Product.DeletedAt == null); if (filter.Id != null && filter.Id.HasValue) { query = query.Where(q => q.Id, filter.Id); } if (filter.ProductId != null && filter.ProductId.HasValue) { query = query.Where(q => q.ProductId, filter.ProductId); } if (filter.Code != null && filter.Code.HasValue) { query = query.Where(q => q.Code, filter.Code); } if (filter.Name != null && filter.Name.HasValue) { query = query.Where(q => q.Name, filter.Name); } if (filter.ScanCode != null && filter.ScanCode.HasValue) { query = query.Where(q => q.ScanCode, filter.ScanCode); } if (filter.SalePrice != null && filter.SalePrice.HasValue) { query = query.Where(q => q.SalePrice, filter.SalePrice); } if (filter.RetailPrice != null && filter.RetailPrice.HasValue) { query = query.Where(q => q.RetailPrice, filter.RetailPrice); } if (filter.ProductGroupingId != null && filter.ProductGroupingId.HasValue) { if (filter.ProductGroupingId.Equal != null) { ProductGroupingDAO ProductGroupingDAO = DataContext.ProductGrouping .Where(o => o.Id == filter.ProductGroupingId.Equal.Value).FirstOrDefault(); query = from q in query join ppg in DataContext.ProductProductGroupingMapping on q.ProductId equals ppg.ProductId join pg in DataContext.ProductGrouping on ppg.ProductGroupingId equals pg.Id where pg.Path.StartsWith(ProductGroupingDAO.Path) select q; } if (filter.ProductGroupingId.NotEqual != null) { ProductGroupingDAO ProductGroupingDAO = DataContext.ProductGrouping .Where(o => o.Id == filter.ProductGroupingId.NotEqual.Value).FirstOrDefault(); query = from q in query join ppg in DataContext.ProductProductGroupingMapping on q.ProductId equals ppg.ProductId join pg in DataContext.ProductGrouping on ppg.ProductGroupingId equals pg.Id where !pg.Path.StartsWith(ProductGroupingDAO.Path) select q; } if (filter.ProductGroupingId.In != null) { List <ProductGroupingDAO> ProductGroupingDAOs = DataContext.ProductGrouping .Where(o => o.DeletedAt == null).ToList(); List <ProductGroupingDAO> Parents = ProductGroupingDAOs.Where(o => filter.ProductGroupingId.In.Contains(o.Id)).ToList(); List <ProductGroupingDAO> Branches = ProductGroupingDAOs.Where(o => Parents.Any(p => o.Path.StartsWith(p.Path))).ToList(); List <long> ProductGroupingIds = Branches.Select(x => x.Id).ToList(); query = from q in query join ppg in DataContext.ProductProductGroupingMapping on q.ProductId equals ppg.ProductId join pg in DataContext.ProductGrouping on ppg.ProductGroupingId equals pg.Id where ProductGroupingIds.Contains(pg.Id) select q; } if (filter.ProductGroupingId.NotIn != null) { List <ProductGroupingDAO> ProductGroupingDAOs = DataContext.ProductGrouping .Where(o => o.DeletedAt == null).ToList(); List <ProductGroupingDAO> Parents = ProductGroupingDAOs.Where(o => filter.ProductGroupingId.NotIn.Contains(o.Id)).ToList(); List <ProductGroupingDAO> Branches = ProductGroupingDAOs.Where(o => Parents.Any(p => o.Path.StartsWith(p.Path))).ToList(); List <long> ProductGroupingIds = Branches.Select(x => x.Id).ToList(); query = from q in query join ppg in DataContext.ProductProductGroupingMapping on q.ProductId equals ppg.ProductId join pg in DataContext.ProductGrouping on ppg.ProductGroupingId equals pg.Id where !ProductGroupingIds.Contains(pg.Id) select q; } } if (filter.ProductTypeId != null && filter.ProductTypeId.HasValue) { query = query.Where(q => q.Product.ProductTypeId, filter.ProductTypeId); } if (filter.StatusId != null && filter.StatusId.HasValue) { query = query.Where(q => q.StatusId, filter.StatusId); } if (filter.OpportunityReportId != null) { query = from q in query join t1 in DataContext.OpportunityItemMapping on q.Id equals t1.ItemId where t1.OpportunityId == filter.OpportunityReportId.Equal select q; } if (filter.Search != null) { List <string> Tokens = filter.Search.Split(" ").Select(x => x.ToLower()).ToList(); var queryForCode = query; var queryForName = query; var queryForOtherName = query; foreach (string Token in Tokens) { if (string.IsNullOrWhiteSpace(Token)) { continue; } queryForCode = queryForCode.Where(x => x.Code.ToLower().Contains(Token)); queryForName = queryForName.Where(x => x.Name.ToLower().Contains(Token)); queryForOtherName = queryForOtherName.Where(x => x.Product.OtherName.ToLower().Contains(Token)); } query = queryForCode.Union(queryForName).Union(queryForOtherName); query = query.Distinct(); } query = OrFilter(query, filter); query = query.Distinct(); return(query); }
private IQueryable <ItemDAO> OrFilter(IQueryable <ItemDAO> query, ItemFilter filter) { if (filter.OrFilter == null || filter.OrFilter.Count == 0) { return(query); } IQueryable <ItemDAO> initQuery = query.Where(q => false); foreach (ItemFilter ItemFilter in filter.OrFilter) { IQueryable <ItemDAO> queryable = query; if (ItemFilter.SalePrice != null && ItemFilter.SalePrice.HasValue) { queryable = queryable.Where(q => q.SalePrice, ItemFilter.SalePrice); } if (ItemFilter.ProductTypeId != null && ItemFilter.ProductTypeId.HasValue) { queryable = queryable.Where(q => q.Product.ProductTypeId, ItemFilter.ProductTypeId); } if (ItemFilter.ProductGroupingId != null && ItemFilter.ProductGroupingId.HasValue) { if (ItemFilter.ProductGroupingId.Equal != null) { ProductGroupingDAO ProductGroupingDAO = DataContext.ProductGrouping .Where(o => o.Id == ItemFilter.ProductGroupingId.Equal.Value).FirstOrDefault(); queryable = from q in queryable join ppg in DataContext.ProductProductGroupingMapping on q.ProductId equals ppg.ProductId join pg in DataContext.ProductGrouping on ppg.ProductGroupingId equals pg.Id where pg.Path.StartsWith(ProductGroupingDAO.Path) select q; } if (ItemFilter.ProductGroupingId.NotEqual != null) { ProductGroupingDAO ProductGroupingDAO = DataContext.ProductGrouping .Where(o => o.Id == ItemFilter.ProductGroupingId.NotEqual.Value).FirstOrDefault(); queryable = from q in queryable join ppg in DataContext.ProductProductGroupingMapping on q.ProductId equals ppg.ProductId join pg in DataContext.ProductGrouping on ppg.ProductGroupingId equals pg.Id where !pg.Path.StartsWith(ProductGroupingDAO.Path) select q; } if (ItemFilter.ProductGroupingId.In != null) { List <ProductGroupingDAO> ProductGroupingDAOs = DataContext.ProductGrouping .Where(o => o.DeletedAt == null).ToList(); List <ProductGroupingDAO> Parents = ProductGroupingDAOs.Where(o => ItemFilter.ProductGroupingId.In.Contains(o.Id)).ToList(); List <ProductGroupingDAO> Branches = ProductGroupingDAOs.Where(o => Parents.Any(p => o.Path.StartsWith(p.Path))).ToList(); List <long> ProductGroupingIds = Branches.Select(o => o.Id).ToList(); queryable = from q in queryable join ppg in DataContext.ProductProductGroupingMapping on q.ProductId equals ppg.ProductId join pg in DataContext.ProductGrouping on ppg.ProductGroupingId equals pg.Id where ProductGroupingIds.Contains(pg.Id) select q; } if (ItemFilter.ProductGroupingId.NotIn != null) { List <ProductGroupingDAO> ProductGroupingDAOs = DataContext.ProductGrouping .Where(o => o.DeletedAt == null).ToList(); List <ProductGroupingDAO> Parents = ProductGroupingDAOs.Where(o => ItemFilter.ProductGroupingId.NotIn.Contains(o.Id)).ToList(); List <ProductGroupingDAO> Branches = ProductGroupingDAOs.Where(o => Parents.Any(p => o.Path.StartsWith(p.Path))).ToList(); List <long> ProductGroupingIds = Branches.Select(o => o.Id).ToList(); queryable = from q in queryable join ppg in DataContext.ProductProductGroupingMapping on q.ProductId equals ppg.ProductId join pg in DataContext.ProductGrouping on ppg.ProductGroupingId equals pg.Id where !ProductGroupingIds.Contains(pg.Id) select q; } } initQuery = initQuery.Union(queryable); } return(initQuery); }