【问题标题】: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# 相同)

标签: c# asp.net-mvc entity-framework linq asp.net-web-api


【解决方案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() 代替。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2019-05-08
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多