mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 15:53:26 +08:00
【优化】优化商品列表的筛选排序方式。
This commit is contained in:
@@ -142,11 +142,12 @@ namespace CoreCms.Net.IRepository
|
||||
/// 重写根据条件及自定义排序查询分页数据(返回DTO)
|
||||
/// </summary>
|
||||
/// <param name="predicate"></param>
|
||||
/// <param name="orderByExpression">排序方式组合</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <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>
|
||||
|
||||
@@ -206,11 +206,12 @@ namespace CoreCms.Net.IServices
|
||||
/// 重写根据条件及自定义排序查询分页数据(返回DTO)
|
||||
/// </summary>
|
||||
/// <param name="predicate"></param>
|
||||
/// <param name="orderByExpression">排序方式组合</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <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>
|
||||
/// 重写根据条件及自定义排序查询分页数据
|
||||
|
||||
@@ -26,6 +26,11 @@ namespace CoreCms.Net.Model.FromBody
|
||||
/// </summary>
|
||||
public int limit { get; set; } = 10;
|
||||
|
||||
/// <summary>
|
||||
/// 排序
|
||||
/// </summary>
|
||||
public string order { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 判断条件
|
||||
/// </summary>
|
||||
|
||||
@@ -24,6 +24,7 @@ using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Newtonsoft.Json;
|
||||
using SqlSugar;
|
||||
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ScanProductAddV2Request.Types.Product.Types;
|
||||
|
||||
namespace CoreCms.Net.Repository
|
||||
{
|
||||
@@ -1667,101 +1668,99 @@ namespace CoreCms.Net.Repository
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件及自定义排序查询分页数据(返回DTO)
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件及自定义排序查询分页数据(返回DTO)
|
||||
/// </summary>
|
||||
/// <param name="predicate"></param>
|
||||
/// <param name="orderByExpression">排序方式组合</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <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;
|
||||
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)
|
||||
{
|
||||
page = await 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,
|
||||
})
|
||||
.With(SqlWith.NoLock)
|
||||
.MergeTable()
|
||||
.Where(predicate)
|
||||
.OrderBy(it => SqlFunc.Desc(it.isRecommend)).OrderBy(it => SqlFunc.Desc(it.isHot))
|
||||
.ToPageListAsync(pageIndex, pageSize, totalCount);
|
||||
sqlCom.With(SqlWith.NoLock);
|
||||
}
|
||||
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(
|
||||
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
|
||||
var orderByArr = orderByExpression.Split(',');
|
||||
foreach (var orderString in orderByArr)
|
||||
{
|
||||
if (orderString.Contains("price asc"))
|
||||
{
|
||||
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()
|
||||
.Where(predicate)
|
||||
.OrderBy(it => SqlFunc.Desc(it.isRecommend)).OrderBy(it => SqlFunc.Desc(it.isHot))
|
||||
.ToPageListAsync(pageIndex, pageSize, totalCount);
|
||||
sqlCom.OrderBy(it => it.price, OrderByType.Asc);
|
||||
}
|
||||
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);
|
||||
return list;
|
||||
|
||||
|
||||
@@ -1001,18 +1001,19 @@ namespace CoreCms.Net.Services
|
||||
|
||||
|
||||
#region 重写根据条件及自定义排序查询分页数据(返回DTO)
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件及自定义排序查询分页数据(返回DTO)
|
||||
/// </summary>
|
||||
/// <param name="predicate"></param>
|
||||
/// <param name="orderBy"></param>
|
||||
/// <param name="orderByExpression">排序方式组合</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <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
|
||||
|
||||
|
||||
@@ -242,8 +242,9 @@ namespace CoreCms.Net.Web.WebApi.Controllers
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user