mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2026-03-22 16:17:21 +08:00
【优化】优化商品列表的筛选排序方式。
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
/// 重写根据条件及自定义排序查询分页数据
|
/// 重写根据条件及自定义排序查询分页数据
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user