张天星 2023-01-13 17:35 采纳率: 0%
浏览 15

EFCore转SQL语句,如何避免Select嵌套

这是我想要的Sql语句

SELECT 
  SUM(`IsRelease`) AS `ItemDownshelfCount`,
  SUM(
    CASE
      WHEN `IsRelease` = 0
      THEN 1 
    END
  ) AS `GoodsCount` 
FROM
  `eshop_goods_tb` 
WHERE 
    `TenantId` = @__tid_0
    AND `IsDelete` = 0;

这个是EFCore查询代码,

            var query = await GetQueryableAsync(w => w.TenantId.Equals(tid) && w.IsDelete.Equals((int)YesOrNoEnum.No));
            var result = query.GroupBy(x=>new { })
                .Select(s => new GoodsOverview
            {
                ItemDownshelfCount = s.Where(w => w.IsRelease == (int)YesOrNoEnum.Yes).Count(),
                GoodsCount = s.Where(w=>w.IsRelease == (int)YesOrNoEnum.No).Count()
            });
            return result.FirstOrDefault();

这是用EFCore拼接出来的Sql语句

主要纠结点是,有两层Select嵌套,这个可以优化么

SELECT CAST(COUNT(CASE
    WHEN `t`.`IsRelease` = 1 THEN 1
END) AS SIGNED) AS `ItemDownshelfCount`, CAST(COUNT(CASE
    WHEN `t`.`IsRelease` = 0 THEN 1
END) AS SIGNED) AS `GoodsCount`
FROM (
    SELECT `e`.`IsRelease`, 1 AS `Key`
    FROM `eshop_goods_tb` AS `e`
    WHERE (`e`.`TenantId` = @__tid_0) AND (`e`.`IsDelete` = 0)
) AS `t`
GROUP BY `t`.`Key`
LIMIT 1

我想知道,这个IQueryable应该怎么写比较好?

  • 写回答

2条回答 默认 最新

  • 流比 2023-01-13 18:53
    关注

    可以尝试使用EF Core的扩展方法AsEnumerable()来解决这个问题。将AsEnumerable()插入到查询中,这样EF Core就不会继续生成SQL语句了,而是将查询结果转换成内存中的集合,然后在内存中进行分组和计算。

    示例代码如下:

    var query = await GetQueryableAsync(w => w.TenantId.Equals(tid) && w.IsDelete.Equals((int)YesOrNoEnum.No));
     var result = query.AsEnumerable()
                       .GroupBy(x=>new { })
                       .Select(s => new GoodsOverview
                       {
                           ItemDownshelfCount = s.Where(w => w.IsRelease == (int)YesOrNoEnum.Yes).Count(),
                           GoodsCount = s.Where(w=>w.IsRelease == (int)YesOrNoEnum.No).Count()
                       });
     return result.FirstOrDefault();
    
    

    这样就可以避免嵌套的 Select 了。

    评论

报告相同问题?

问题事件

  • 修改了问题 1月13日
  • 创建了问题 1月13日

悬赏问题

  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'