tnblog
首页
视频
资源
登录

用Linq解决商品和其下sku的筛选排序查询

6678人阅读 2018/12/27 15:53 总访问:31819 评论:0 收藏:0 手机
分类: Linq

本是sql to linq的东西,但是用的框架是.core 2.1,所以就归到core里吧


最近遇到一个稍微复杂点的小问题

需求:商城的商品列表排序,按商品排序编号,同商品下sku的最低价来升降排序

开始做成拆分为几步,代码比较复杂,效率不高,后面找到了简单的解决方案:


  1.                 List<ProListModel> ProList = new List<ProListModel>();
  2.                 var query = (from pro in context.ShopProductInfo.Where(@where)
  3.                              join sku in context.ShopSkuProduct.Where(skuwhere)
  4.                              on pro.ProductNo equals sku.ProductNo
  5.                              group sku by sku.ProductNo into g
  6.                              select new ProListModel
  7.                              {
  8.                                  Id = context.ShopProductInfo.SingleOrDefault(c => c.ProductNo == g.Key).Id,
  9.                                  ProductName = context.ShopProductInfo.SingleOrDefault(c => c.ProductNo == g.Key).ProductName,
  10.                                  ProductNo = g.Key,
  11.                                  Type = context.ShopProductInfo.SingleOrDefault(c => c.ProductNo == g.Key).Type,
  12.                                  ShortDesc = context.ShopProductInfo.SingleOrDefault(c => c.ProductNo == g.Key).ShortDesc,
  13.                                  ThumbImage = context.ShopProductInfo.SingleOrDefault(c => c.ProductNo == g.Key).ThumbImage,
  14.                                  CategoryId = context.ShopProductInfo.SingleOrDefault(c => c.ProductNo == g.Key).CategoryId,
  15.                                  Price = g.OrderBy(c => c.SalePrice).FirstOrDefault().SalePrice,
  16.                                  ShowOrder = context.ShopProductInfo.SingleOrDefault(c => c.ProductNo == g.Key).ShowOrder,
  17.                              }).AsQueryable();
  18.                 if (parameter.Sort == "desc")
  19.                 {
  20.                     query = query.OrderByDescending(p => p.Price);
  21.                 }
  22.                 else if (parameter.Sort == "asc")
  23.                 {
  24.                     query = query.OrderBy(p => p.Price);
  25.                 }
  26.                 else
  27.                 {
  28.                     query = query.OrderByDescending(p => p.CreateTime).OrderBy(p => p.ShowOrder);
  29.                 }
  30.                 result.Total = query.ToList().Count();
  31.                 result.Data = new GetProductListResult
  32.                 {
  33.                     ProList = query.Skip(parameter.PageSize * (parameter.PageIndex - 1))
  34.                     .Take(parameter.PageSize)
  35.                     .ToList(),
  36.                 };

这里主要是归纳一下两表联查的时候根据不同顺序,不同字段排序的优解方案以及Linq分组后进行表内排序的语法


/*-----------------------------------------                    分                鸽                线                    -------------------------------------------*/

上面的方法虽然解决了问题,但是放到实际场景时。接口处理的速度很慢,不传筛选的参数大概3s,传了有时候会到4~5s之久

所以又找了很多方法,各种尝试


一个半小时奋战,终于得到跟简单的方法


  1. var query = (from sku in context.ShopSkuProduct.Where(skuwhere)
  2.                              .GroupBy(o => o.ProductNo)
  3.                                  .Select(o => new
  4.                                  {
  5.                                      ProductNo = o.Key,
  6.                                      Saleprice = o.Min(x => x.SalePrice)
  7.                                  })
  8.                              join pro in context.ShopProductInfo.AsNoTracking().Where(@where)
  9.                              on sku.ProductNo equals pro.ProductNo 
  10.                              select new ProListModel
  11.                              {
  12.                                  ProductName = pro.ProductName,
  13.                                  ProductNo = pro.ProductNo,
  14.                                  ThumbImage = pro.ThumbImage,
  15.                                  Price = sku.Saleprice,
  16.                                  CreateTime = pro.CreateTime,
  17.                                  ShowOrder = pro.ShowOrder,
  18.                              }).AsQueryable();

把原来的query部分换成新的,速度飞快


hiahiahia~~perfect

评价
酸甜苦辣才是生活 起起浮浮才是人生
排名
59
文章
6
粉丝
2
评论
2
配置Java环境
剑轩 : 现在有些不是一键安装就搞定了么~
C#解决execl中的ROUNDUP函数
剑轩 : 楼掰楼掰,好方法
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术