张天星 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 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错