diff --git a/CoreCms.Net.Repository/Good/CoreCmsGoodsRepository.cs b/CoreCms.Net.Repository/Good/CoreCmsGoodsRepository.cs index f00b0f4d..0bc4d13a 100644 --- a/CoreCms.Net.Repository/Good/CoreCmsGoodsRepository.cs +++ b/CoreCms.Net.Repository/Good/CoreCmsGoodsRepository.cs @@ -888,133 +888,43 @@ namespace CoreCms.Net.Repository /// public async Task> GetGoodsRecommendList(int number, bool isRecommend = false) { - var list = new List(); - - if (isRecommend) - { - var ids = await DbClient.Queryable().Where(p => p.isDel == false && p.isMarketable == true && p.isRecommend == true) - .Select(p => p.id).ToArrayAsync(); - var dbIds = new List(); - if (!ids.Any()) return list; + var list = await DbClient.Queryable((good, pd) => new JoinQueryInfos( + JoinType.Left, good.id == pd.goodsId)) + .Where((good, pd) => pd.isDefalut == true && pd.isDel == false && good.isRecommend == isRecommend && good.isDel == false && good.isMarketable == true) + .Select((good, pd) => new GoodListDTO { - if (ids.Length < number) - { - number = ids.Length; - } + 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() + .LeftJoin((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() + .OrderBy(p => SqlFunc.GetRandom()).Take(number).ToListAsync(); - for (int i = 0; i < number; i++) - { - var id = GetRandomNumber(ids); - while (dbIds.Contains(id))//判断集合中有没有生成的随机数,如果有,则重新生成一个随机数,直到生成的随机数list集合中没有才退出循环 - { - id = GetRandomNumber(ids); - } - dbIds.Add(id); - } - if (dbIds.Any()) - { - list = await DbClient.Queryable((good, pd) => new JoinQueryInfos( - JoinType.Left, good.id == pd.goodsId)) - .Where((good, pd) => pd.isDefalut == true && pd.isDel == false && good.isRecommend == true && good.isDel == false && good.isMarketable == true) - .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() - .LeftJoin((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(p => dbIds.Contains(p.id)).ToListAsync(); - } - } - - } - else - { - var ids = await DbClient.Queryable().Where(p => p.isDel == false && p.isMarketable == true) - .Select(p => p.id).ToArrayAsync(); - var dbIds = new List(); - if (!ids.Any()) return list; - { - if (ids.Length < number) - { - number = ids.Length; - } - - for (int i = 0; i < number; i++) - { - var id = GetRandomNumber(ids); - while (dbIds.Contains(id))//判断集合中有没有生成的随机数,如果有,则重新生成一个随机数,直到生成的随机数list集合中没有才退出循环 - { - id = GetRandomNumber(ids); - } - dbIds.Add(id); - } - if (dbIds.Any()) - { - list = await DbClient.Queryable((good, pd) => new JoinQueryInfos( - JoinType.Left, good.id == pd.goodsId)) - .Where((good, pd) => pd.isDefalut == true && pd.isDel == false && good.isRecommend == true && good.isDel == false && good.isMarketable == true) - .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() - .LeftJoin((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(p => dbIds.Contains(p.id)).ToListAsync(); - } - } - } return list; }