为啥 .Select 或 .ToList() 提供嵌套 JSON,而 .Count 在父 JSON 中出现?

Posted

技术标签:

【中文标题】为啥 .Select 或 .ToList() 提供嵌套 JSON,而 .Count 在父 JSON 中出现?【英文标题】:why .Select or .ToList() is giving Nested JSON while .Count is comming in parent JSON?为什么 .Select 或 .ToList() 提供嵌套 JSON,而 .Count 在父 JSON 中出现? 【发布时间】:2019-10-07 22:15:36 【问题描述】:

所有三个(Attendance,InTime,OutTime)都来自引用的表

Attendence = CheckAttendance.Where(y => y.EmployeeId == x.EmployeeId).Count(),
InTime = CheckAttendance.Where(y => y.EmployeeId == x.EmployeeId).Select(y=>y.StartTime).ToList(),
OutTime = CheckAttendance.Where(y => y.EmployeeId == x.EmployeeId).Select(y=>y.EndTime),

C# api 代码

 var TentId = objdb.Adminsitrators.Where(x => x.AdminId == AdminId).Select(x => x.TenantID).SingleOrDefault();
 var emp = objdb.Employees.Where(x=>x.TenantID== TentId).ToList(); 
         if (emp.Count > 0)
           
             var CheckAttendance = objdb.EmpAttendances.Where(x => x.Status == "Present" & x.TenantID==TentId & x.StartTime.Year == StartTime.Year & x.StartTime.Month == StartTime.Month & x.StartTime.Day == StartTime.Day).ToList();
             var list = emp.Select(x => new
               
                  EmpID = x.EmployeeId,
                  EmpName = x.Name,
                  EmpImage = "Areas/Admin/Image/" + x.Image,
                  Configured = fileResult(x.EmployeeId),
                  Attendence = CheckAttendance.Where(y => y.EmployeeId == x.EmployeeId).Count(),
                  InTime = CheckAttendance.Where(y => y.EmployeeId == x.EmployeeId).Select(y=>y.StartTime).ToList(),
                  OutTime = CheckAttendance.Where(y => y.EmployeeId == x.EmployeeId).Select(y=>y.EndTime),
                    ).ToList();

                    Value["result"] = "TRUE";
                    Value["Data"] = list;
                

JSON 结果

 "result": "TRUE",
    "Data": [
        
            "EmpID": 14,
            "EmpName": "Arun Kumar",
            "EmpImage": "Areas/Admin/Image/EmployeeImg_55991775.JPG",
            "Configured": 0,
            "Attendence": 1,                 //Count Data
            "InTime": [
                "2019-05-21T16:13:18.873"    //Tolist
            ],
            "OutTime": [
                "2019-05-21T16:12:51.967"    //Select
            ]
        ,

【问题讨论】:

Attendence 是一个整数,而不是像 InTimeOutTime 这样的列表。因此,当转换为 JSON 时,只有值而不是值列表(与 c# 相同) 【参考方案1】:

因为您可以有多个 InTime 或 OutTime 值,所以它们被序列化为 JSON 数组,但是当您 .Count() 一个集合时,您会将其转换为标量值。如果要从集合中选择单个值,请使用 .Max()、.First() 或 .OrderBy(...).Take(1)。或者 .Single() 如果你知道集合总是包含一个项目。

【讨论】:

是的,这就是使用 Single/max()/First() 获取 Sequence 时的问题,因为 intime 和 outtime 可能为空,并且它只是一个列值 @ArunPratap 如果您需要考虑空值,请使用SingleOrDefault【参考方案2】:

根据关系,Select 和 ToList 可能会导致多个结果。 如果你想要 Intime 和 OutTime 的 Max time 或最后插入的值,你应该查询它。此外,您可以使用 .FirstOrDefault() 代替。

【讨论】:

以上是关于为啥 .Select 或 .ToList() 提供嵌套 JSON,而 .Count 在父 JSON 中出现?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要 ToList() 来避免已处理的上下文错误?

List的Select 和Select().tolist()

csharp List.Select.ToList

为啥 toList() 在 Dart 中创建一个 List<dynamic>?

为啥仅通过更改 SELECT 子句就可以得到零行或具有 NULL 值的行?

我需要迭代和计数。啥是最快或首选:ToArray() 或 ToList()? [复制]