为啥 .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
是一个整数,而不是像 InTime
和 OutTime
这样的列表。因此,当转换为 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 中出现?的主要内容,如果未能解决你的问题,请参考以下文章
List的Select 和Select().tolist()
为啥 toList() 在 Dart 中创建一个 List<dynamic>?