【优化】优化商品列表的筛选排序方式。

This commit is contained in:
jianweie code
2024-03-21 13:34:29 +08:00
parent 02b9ac94dc
commit 429da5e2fc
6 changed files with 93 additions and 85 deletions

View File

@@ -142,11 +142,12 @@ namespace CoreCms.Net.IRepository
/// 重写根据条件及自定义排序查询分页数据返回DTO /// 重写根据条件及自定义排序查询分页数据返回DTO
/// </summary> /// </summary>
/// <param name="predicate"></param> /// <param name="predicate"></param>
/// <param name="orderByExpression">排序方式组合</param>
/// <param name="pageIndex">当前页面索引</param> /// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param> /// <param name="pageSize">分布大小</param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param> /// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns> /// <returns></returns>
Task<IPageList<GoodListDTO>> QueryPageByDTOAsync(Expression<Func<GoodListDTO, bool>> predicate, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false); Task<IPageList<GoodListDTO>> QueryPageByDTOAsync(Expression<Func<GoodListDTO, bool>> predicate, string orderByExpression, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false);
/// <summary> /// <summary>

View File

@@ -206,11 +206,12 @@ namespace CoreCms.Net.IServices
/// 重写根据条件及自定义排序查询分页数据返回DTO /// 重写根据条件及自定义排序查询分页数据返回DTO
/// </summary> /// </summary>
/// <param name="predicate"></param> /// <param name="predicate"></param>
/// <param name="orderByExpression">排序方式组合</param>
/// <param name="pageIndex">当前页面索引</param> /// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param> /// <param name="pageSize">分布大小</param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param> /// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns> /// <returns></returns>
Task<IPageList<GoodListDTO>> QueryPageByDTOAsync(Expression<Func<GoodListDTO, bool>> predicate, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false); Task<IPageList<GoodListDTO>> QueryPageByDTOAsync(Expression<Func<GoodListDTO, bool>> predicate, string orderByExpression, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false);
/// <summary> /// <summary>
/// 重写根据条件及自定义排序查询分页数据 /// 重写根据条件及自定义排序查询分页数据

View File

@@ -26,6 +26,11 @@ namespace CoreCms.Net.Model.FromBody
/// </summary> /// </summary>
public int limit { get; set; } = 10; public int limit { get; set; } = 10;
/// <summary>
/// 排序
/// </summary>
public string order { get; set; } = string.Empty;
/// <summary> /// <summary>
/// 判断条件 /// 判断条件
/// </summary> /// </summary>

View File

@@ -24,6 +24,7 @@ using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Helper; using CoreCms.Net.Utility.Helper;
using Newtonsoft.Json; using Newtonsoft.Json;
using SqlSugar; using SqlSugar;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ScanProductAddV2Request.Types.Product.Types;
namespace CoreCms.Net.Repository namespace CoreCms.Net.Repository
{ {
@@ -1667,101 +1668,99 @@ namespace CoreCms.Net.Repository
#endregion #endregion
#region DTO #region DTO
/// <summary> /// <summary>
/// 重写根据条件及自定义排序查询分页数据返回DTO /// 重写根据条件及自定义排序查询分页数据返回DTO
/// </summary> /// </summary>
/// <param name="predicate"></param> /// <param name="predicate"></param>
/// <param name="orderByExpression">排序方式组合</param>
/// <param name="pageIndex">当前页面索引</param> /// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param> /// <param name="pageSize">分布大小</param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param> /// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns> /// <returns></returns>
public async Task<IPageList<GoodListDTO>> QueryPageByDTOAsync(Expression<Func<GoodListDTO, bool>> predicate, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false) public async Task<IPageList<GoodListDTO>> QueryPageByDTOAsync(Expression<Func<GoodListDTO, bool>> predicate, string orderByExpression, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
{ {
RefAsync<int> totalCount = 0; RefAsync<int> totalCount = 0;
List<GoodListDTO> page; var sqlCom = DbClient.Queryable<CoreCmsGoods, CoreCmsProducts>((good, pd) => new JoinQueryInfos(
JoinType.Left, good.id == pd.goodsId))
.Where((good, pd) => pd.isDefalut == true && pd.isDel == false && good.isMarketable == true && good.isDel == false)
.Select((good, pd) => new GoodListDTO
{
id = good.id,
name = good.name,
brief = good.brief,
image = !SqlFunc.IsNullOrEmpty(good.image) ? good.image : EmptyOrNullImagePath.GoodImage,
video = good.video,
goodsCategoryId = good.goodsCategoryId,
goodsTypeId = good.goodsTypeId,
brandId = good.brandId,
isNomalVirtual = good.isNomalVirtual,
unit = good.unit,
commentsCount = good.commentsCount,
viewCount = good.viewCount,
buyCount = SqlFunc.Subqueryable<CoreCmsOrderItem>()
.LeftJoin<CoreCmsOrder>((sOrderItem, sOrder) => sOrder.orderId == sOrderItem.orderId)
.Where((sOrderItem, sOrder) => sOrderItem.goodsId == good.id && (sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes || sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.PartialYes))
.Sum((sOrderItem, sOrder) => sOrderItem.nums),
sort = good.sort,
labelIds = good.labelIds,
createTime = good.createTime,
isRecommend = good.isRecommend,
isHot = good.isHot,
price = pd.price,
mktprice = pd.mktprice,
stock = pd.stock,
pointsDeduction = pd.pointsDeduction,
points = pd.points,
weight = pd.weight,
initialSales = good.initialSales,
}).MergeTable();
if (blUseNoLock) if (blUseNoLock)
{ {
page = await DbClient.Queryable<CoreCmsGoods, CoreCmsProducts>((good, pd) => new JoinQueryInfos( sqlCom.With(SqlWith.NoLock);
JoinType.Left, good.id == pd.goodsId))
.Where((good, pd) => pd.isDefalut == true && pd.isDel == false && good.isMarketable == true && good.isDel == false)
.Select((good, pd) => new GoodListDTO
{
id = good.id,
name = good.name,
brief = good.brief,
image = !SqlFunc.IsNullOrEmpty(good.image) ? good.image : EmptyOrNullImagePath.GoodImage,
video = good.video,
goodsCategoryId = good.goodsCategoryId,
goodsTypeId = good.goodsTypeId,
brandId = good.brandId,
isNomalVirtual = good.isNomalVirtual,
unit = good.unit,
commentsCount = good.commentsCount,
viewCount = good.viewCount,
buyCount = SqlFunc.Subqueryable<CoreCmsOrderItem>()
.LeftJoin<CoreCmsOrder>((sOrderItem, sOrder) => sOrder.orderId == sOrderItem.orderId)
.Where((sOrderItem, sOrder) => sOrderItem.goodsId == good.id && (sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes || sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.PartialYes))
.Sum((sOrderItem, sOrder) => sOrderItem.nums),
sort = good.sort,
labelIds = good.labelIds,
createTime = good.createTime,
isRecommend = good.isRecommend,
isHot = good.isHot,
price = pd.price,
mktprice = pd.mktprice,
stock = pd.stock,
pointsDeduction = pd.pointsDeduction,
points = pd.points,
weight = pd.weight,
initialSales = good.initialSales,
})
.With(SqlWith.NoLock)
.MergeTable()
.Where(predicate)
.OrderBy(it => SqlFunc.Desc(it.isRecommend)).OrderBy(it => SqlFunc.Desc(it.isHot))
.ToPageListAsync(pageIndex, pageSize, totalCount);
} }
else
sqlCom.Where(predicate);
sqlCom.OrderBy(it => it.isRecommend, OrderByType.Desc).OrderBy(it => it.isHot, OrderByType.Desc);
//为了防止sql注入所以需要遍历一遍改成参数化执行sql
if (!string.IsNullOrEmpty(orderByExpression))
{ {
page = await DbClient.Queryable<CoreCmsGoods, CoreCmsProducts>((good, pd) => new JoinQueryInfos( var orderByArr = orderByExpression.Split(',');
JoinType.Left, good.id == pd.goodsId)) foreach (var orderString in orderByArr)
.Where((good, pd) => pd.isDefalut == true && pd.isDel == false && good.isMarketable == true && good.isDel == false)
.Select((good, pd) => new GoodListDTO
{ {
id = good.id, if (orderString.Contains("price asc"))
name = good.name, {
brief = good.brief, sqlCom.OrderBy(it => it.price, OrderByType.Asc);
image = !SqlFunc.IsNullOrEmpty(good.image) ? good.image : EmptyOrNullImagePath.GoodImage,
video = good.video,
goodsCategoryId = good.goodsCategoryId,
goodsTypeId = good.goodsTypeId,
brandId = good.brandId,
isNomalVirtual = good.isNomalVirtual,
unit = good.unit,
commentsCount = good.commentsCount,
viewCount = good.viewCount,
buyCount = SqlFunc.Subqueryable<CoreCmsOrderItem>()
.LeftJoin<CoreCmsOrder>((sOrderItem, sOrder) => sOrder.orderId == sOrderItem.orderId)
.Where((sOrderItem, sOrder) => sOrderItem.goodsId == good.id && (sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes || sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.PartialYes))
.Sum((sOrderItem, sOrder) => sOrderItem.nums),
sort = good.sort,
labelIds = good.labelIds,
createTime = good.createTime,
isRecommend = good.isRecommend,
isHot = good.isHot,
price = pd.price,
mktprice = pd.mktprice,
stock = pd.stock,
pointsDeduction = pd.pointsDeduction,
points = pd.points,
weight = pd.weight,
initialSales = good.initialSales,
})
.MergeTable()
.Where(predicate)
.OrderBy(it => SqlFunc.Desc(it.isRecommend)).OrderBy(it => SqlFunc.Desc(it.isHot))
.ToPageListAsync(pageIndex, pageSize, totalCount);
} }
else if (orderString.Contains("price desc"))
{
sqlCom.OrderBy(it => it.price, OrderByType.Desc);
}
if (orderString.Contains("buyCount asc"))
{
sqlCom.OrderBy(it => it.buyCount, OrderByType.Asc);
}
else if (orderString.Contains("buyCount desc"))
{
sqlCom.OrderBy(it => it.buyCount, OrderByType.Desc);
}
if (orderString.Contains("sort asc"))
{
sqlCom.OrderBy(it => it.sort, OrderByType.Asc);
}
else if (orderString.Contains("sort desc"))
{
sqlCom.OrderBy(it => it.sort, OrderByType.Desc);
}
}
}
List<GoodListDTO> page = await sqlCom.ToPageListAsync(pageIndex, pageSize, totalCount);
var list = new PageList<GoodListDTO>(page, pageIndex, pageSize, totalCount); var list = new PageList<GoodListDTO>(page, pageIndex, pageSize, totalCount);
return list; return list;

View File

@@ -1001,18 +1001,19 @@ namespace CoreCms.Net.Services
#region DTO #region DTO
/// <summary> /// <summary>
/// 重写根据条件及自定义排序查询分页数据返回DTO /// 重写根据条件及自定义排序查询分页数据返回DTO
/// </summary> /// </summary>
/// <param name="predicate"></param> /// <param name="predicate"></param>
/// <param name="orderBy"></param> /// <param name="orderByExpression">排序方式组合</param>
/// <param name="pageIndex">当前页面索引</param> /// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param> /// <param name="pageSize">分布大小</param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param> /// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns> /// <returns></returns>
public async Task<IPageList<GoodListDTO>> QueryPageByDTOAsync(Expression<Func<GoodListDTO, bool>> predicate, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false) public async Task<IPageList<GoodListDTO>> QueryPageByDTOAsync(Expression<Func<GoodListDTO, bool>> predicate, string orderByExpression, int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
{ {
return await _dal.QueryPageByDTOAsync(predicate, pageIndex, pageSize, blUseNoLock); return await _dal.QueryPageByDTOAsync(predicate, orderByExpression, pageIndex, pageSize, blUseNoLock);
} }
#endregion #endregion

View File

@@ -242,8 +242,9 @@ namespace CoreCms.Net.Web.WebApi.Controllers
where = where.And(p => p.name.Contains(obj.searchName)); where = where.And(p => p.name.Contains(obj.searchName));
} }
} }
//获取数据 //获取数据
var list = await _goodsServices.QueryPageByDTOAsync(where, entity.page, entity.limit, true); var list = await _goodsServices.QueryPageByDTOAsync(where, entity.order, entity.page, entity.limit, true);
//获取品牌 //获取品牌
var brands = await _brandServices.QueryListByClauseAsync(p => p.isShow == true, p => p.sort, OrderByType.Desc, true, true); var brands = await _brandServices.QueryListByClauseAsync(p => p.isShow == true, p => p.sort, OrderByType.Desc, true, true);