tnblog
首页
视频
资源
登录

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

6406人阅读 2018/12/27 15:53 总访问:30324 评论: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

评价

NET Core 使 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

使OLEDB读取不同版本Excel的连接字符串设置

使用OleBD读取excel的时候,excel不同的版本,连接字符串的写法也会不一样。///&lt;summary&gt; ///读取excel ///&lt;/su...

vs2017 对 COM 组件的调返回了错误 HRESULT E_FAIL

vs2017添加引用报错 对 COM 组件的调用返回了错误 HRESULT E_FAIL 1.以管理员身份打开vs2017开发人员命令指示符 2...

如何修改重置MD5加密后的SQL户密码

二次开发时,要加一个忘记密码的功能,后台写了修改密码的方法,数据库执行也修改成功,但是登录一直提示密码错误。之所以...

时间日期处理总结

时间处理是项目中不可缺少的,下面整理了一些常用时间处理的用法,记录一下。原文地址:https://blog.csdn.net/ohdajing/ar...

C ?、?? 问号和2个问号的法(类型?、对象?)

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

C out、ref关键字的法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。out:classProgram { /* *out、ref都是引用传递,传递后使用都会改变...

C 使CancellationTokenSource取消多线程

有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消如下:...

使爬虫刷csdn博客访问量

首先了解一下常见反爬虫的检测方法频率监测:有些网站会设置一种频率监测的机制,对于同一IP,若在一定时间内访问的速度超...

Redis常命令

启动服务命令 redis-server.exe redis.windows.conf 连接命令 redis-cli.exe -h ip地址 -p 6379 连接本地...

Redis常配置

配置主从节点slaveof127.0.0.16379 可能会遇到持久化错误:Error reply to PING from master: ‘-MISCONF Redis is configu...

Idea下使maven搭建SSM(一):SpringMVC

Spring MVC是一款基于MVC架构模式的轻量级Web框架,其目的是将Web开发模块化,对整体架构进行解耦,简化Web开发流程。下面...

Idea下使maven搭建SSM(二):MyBatis

开发Web应用,数据的存储和处理往往离不开数据库和SQL语句。在使用Java开发的Web应用中,自然也少不了连接数据库的步骤。在...

的很厉害的工具

图片压缩相对图片无损放大来说是小kiss。下面是非常非常帅气的图片无损放大http://bigjpg.com/图片压缩https://www.upyun.c...

网页上传文件断点续传的实现,无视文件大小上传,以及datatables基本

首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理1.HTML页面,文件信...

DIV+CSS网页布局常的一些基础知识整理

一.文件命名规范全局样式:global.css;框架布局:layout.css;字体样式:font.css;链接样式:link.css;打印样式:print...
酸甜苦辣才是生活 起起浮浮才是人生
排名
59
文章
6
粉丝
2
评论
2
配置Java环境
剑轩 : 现在有些不是一键安装就搞定了么~
C#解决execl中的ROUNDUP函数
剑轩 : 楼掰楼掰,好方法
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术