public ActionResult Search(PagerRequest request, StoreCouponSequenceOption search) { if (!ModelState.IsValid) { ViewBag.SearchOptions = search; return View(); } var prods = doSearch(search); var v = new Pager<StoreCouponSequenceViewModel>(request, prods.Count()) { Data = prods.ToList() }; ViewBag.SearchOptions = search; return View(v); }
private IEnumerable<StoreCouponSequenceViewModel> doSearch(StoreCouponSequenceOption search) { var dbContext = _storecouponRepo.Context; var clinq = from cl in dbContext.Set<CouponLogEntity>() join sr in dbContext.Set<StoreRealEntity>() on cl.ConsumeStoreNo equals sr.StoreNo into cls from csl in cls.DefaultIfEmpty() select new {CL = cl,CS = csl}; var linq= dbContext.Set<StoreCouponEntity>() .Join(dbContext.Set<StorePromotionEntity>(),o=>o.StorePromotionId,i=>i.Id,(o,i)=>new {SC=o,SP=i}) .GroupJoin(clinq ,o=>o.SC.Code,i=>i.CL.Code,(o,i)=>new {SC = o.SC,SP=o.SP,CL = i}) .Where(s=>(string.IsNullOrEmpty(search.PromotionName) || s.SP.Name.StartsWith(search.PromotionName)) && (!search.CreateDateFrom.HasValue || s.SC.CreateDate>=search.CreateDateFrom.Value) && (!search.CreateDateTo.HasValue || s.SC.CreateDate <= search.CreateDateTo.Value) && (!search.PointFrom.HasValue || s.SC.Points>=search.PointFrom.Value) && (!search.PointTo.HasValue || s.SC.Points < search.PointTo.Value) && (!search.CustomerId.HasValue || s.SC.UserId == search.CustomerId.Value) && (string.IsNullOrEmpty(search.StoreNo) || s.CL.Any(c=>c.CL.ConsumeStoreNo==search.StoreNo)) && (!search.ConsumeDateFrom.HasValue || s.CL.Any(c=>c.CL.CreateDate>=search.ConsumeDateFrom.Value && c.CL.ActionType==(int)CouponActionType.Consume)) && (!search.ConsumeDateTo.HasValue || s.CL.Any(c=>c.CL.CreateDate<search.ConsumeDateTo.Value && c.CL.ActionType ==(int)CouponActionType.Consume)) && (string.IsNullOrEmpty(search.ReceiptNo) || s.CL.Any(c=>c.CL.ReceiptNo==search.ReceiptNo))); if (search.Status.HasValue) { switch(search.Status.Value) { case StoreCouponSequenceStatus.CreateNotConsume: linq = linq.Where(l=>l.SC.Status == (int)CouponStatus.Normal && l.SC.ValidEndDate>DateTime.Now); break; case StoreCouponSequenceStatus.Consumed: linq = linq.Where(l=>l.SC.Status == (int)CouponStatus.Used); break; case StoreCouponSequenceStatus.Expired: linq = linq.Where(l=>l.SC.Status == (int)CouponStatus.Normal && l.SC.ValidEndDate<=DateTime.Now); break; case StoreCouponSequenceStatus.Rebated: linq = linq.Where(l=>l.SC.Status == (int)CouponStatus.Normal && l.SC.ValidEndDate>DateTime.Now && l.CL.Any() && l.CL.OrderByDescending(cl=>cl.CL.CreateDate).FirstOrDefault().CL.ActionType == (int)CouponActionType.Rebate); break; case StoreCouponSequenceStatus.Void: linq = linq.Where(l=>l.SC.Status == (int)CouponStatus.Deleted); break; } } var sort = search.Sort.HasValue?search.Sort.Value:StoreCouponSequenceSort.ByCreateDate; if (search.Sort.HasValue) { switch(sort) { case StoreCouponSequenceSort.ByCreateDate: linq= linq.OrderByDescending(l=>l.SC.CreateDate); break; case StoreCouponSequenceSort.ByAmount: linq= linq.OrderByDescending(l=>l.SC.Amount); break; case StoreCouponSequenceSort.ByStatus: linq = linq.OrderByDescending(l=>l.SC.Status); break; } } var result = linq.ToList().Select(l => new StoreCouponSequenceViewModel() { Code = l.SC.Code, Amount = l.SC.Amount.Value, CustomerId = l.SC.UserId.Value, CreateDate = l.SC.CreateDate.Value, RawStatus =l.SC.Status.Value, UpdateDate = l.SC.UpdateDate.Value, PromotionName = l.SP.Name, ValidEndDate = l.SC.ValidEndDate.Value, Logs = l.CL.OrderByDescending(cl=>cl.CL.CreateDate) .Select(cl=>new CouponLogViewModel().FromEntity<CouponLogViewModel>(cl.CL,p=>{ p.StoreName = cl.CS==null?string.Empty: cl.CS.Name; })) }); return result; }