【问题标题】:aggregation count in linq query returns nulllinq 查询中的聚合计数返回 null
【发布时间】:2020-07-27 14:12:18
【问题描述】:

我正在实施 asp.net core 3.1 项目。在我的控制器中,我有一个如下所示的 linq 查询,并且没有定义 inprocessapicount 和pendingcount 来计算相关金额的计数,它工作正常,但是在选择部分将它们添加到申请者查询后,申请者返回 null 并且错误是:.Count(a => a.requestStatus == "bb") 无法翻译。以可以翻译的形式重写查询,或者通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端评估。如果有人建议我解决方案,我将不胜感激。

 var applicants = (from t1 in _context.VwDesk
                              
                              let tg = new {
     
                                   itemID = t1.ItemId,
                                   applicantID = t1.ApplicantId,
                                   applicantName = t1.ApplicantName,
                                 
                                   gateName =t1.GateName,

                                   requestStatus = t1.LastReqStatus
                               }
                               group tg by new { tg.requestStatus,tg.itemID ,tg.applicantID, tg.applicantName} into ApiAppGp
                               select new
                               {
                                   applicantName = ApiAppGp.Key.applicantName,

                                   itemname = ApiAppGp.Key.itemID,
 
                                   itemcount =ApiAppGp.Count(),

                                   inprocessapicount = ApiAppGp.Where(a => a.requestStatus == "bb").Count(),
                                   pendingapicount = ApiAppGp.Where(a => a.requestStatus == "aa").Count()


                               }).ToList();

我想要的是:数据库中有一些申请人,每个申请人可能有多个或零个请求。 (每个申请人订购多个或零个 itemID)每个申请人都需要获得一些物品(itemID),并且这些物品中的每一个都有 requeststatus =="aa" 或 requeststatus =="bb" 或没有其中的状态案例是“一般”。现在我想了解,根据他们订购的所有ItemId,每个申请人的itemID有多少个requeststatus=="aa",每个申请人的itemID有多少个requeststatus=="bb"。

【问题讨论】:

  • “在选择部分将它们添加到我的查询后” - 你能显示失败的代码,而不是工作的代码吗?

标签: c# linq asp.net-core


【解决方案1】:

尝试结合 WhereCount 方法,因为 Count 也有 Lambda 版本:

inprocessapicount = ApiAppGp.Count(a => a.requestStatus == "bb"),
pendingapicount = ApiAppGp.Count(a => a.requestStatus == "aa")

否则,我在您的代码中看不到任何问题,除非 GroupBy 语句实际上可以找到 Group 的任何元素(空集合)。
也尝试在不使用初始 select 语句(group by 之前)的情况下运行相同的结果。

【讨论】:

  • 我按照您的建议写了,但 count() 仍然返回 null。错误是: .Count(a => a.requestStatus == "bb") 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估
  • Here 很好地解释了上述问题。我可以在这里建议的是在GroupBy 之后调用ToList(),并且仅在调用Select 声明之后。
  • 我认为问题是有时没有 a => a.requestStatus == "bb" 或 a => a.requestStatus == "aa" 匹配条件,因此它们返回 null。但我不知道如何解决这个问题。
  • @MinaMRM 如果没有不应该返回 null 而是 0 的匹配项。在访问 requestStatus 之前尝试使用 ? 运算符,例如 a?.requestStatus == "bb"
  • 感谢您的回复。当我添加?到表达式,它向我显示错误。
猜你喜欢
  • 1970-01-01
  • 2020-01-29
  • 2020-05-19
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
相关资源
最近更新 更多