JSON 序列化中的错误“已有一个与此命令关联的打开的数据读取器”

本文关键字:关联 数据 读取 命令 错误 序列化 JSON 有一个 | 更新日期: 2023-09-27 17:49:24

Json 序列化命令给出此错误。我使用Newtonsoft.Json来避免序列化时的循环引用错误。

private IQueryable<Study> GetStudiesData()
{
    var currUser = UserManager.FindById(User.Identity.GetUserId());
    var currUserRole = currUser.Roles.First();
    IQueryable<Study> studies;
    if (User.IsInRole("SuperAdmin")) {
        studies = db.Studies; //all studies from all centers 
    }
    else {
        var assignedStudies = db.Studies.Where(s => s.AssignedUserID == currUser.Id);
        studies = db.Studies.Where(s => s.User.CenterId == currUser.CenterId && s.RoleID == currUserRole.RoleId)
            .Concat(assignedStudies);
    }
    return studies;
}
//ajax call to this function gives error
public ActionResult GetStudies(int pageSize = 10, int pageNum = 1)
{
    var studies = GetStudiesData();
    var studiesCount = studies.Count();
    var studiesPaged = studies.OrderBy(s=>s.PatientID).Skip(pageSize*pageNum).Take(pageSize);
    var result = new { TotalRows = studiesCount, Rows = studiesPaged };
    //this line gives error
    //There is already an open DataReader associated with this Command which must be closed first.
    var data = Newtonsoft.Json.JsonConvert.SerializeObject(result, Newtonsoft.Json.Formatting.None,
    new Newtonsoft.Json.JsonSerializerSettings()
    {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    });
    return Json(data, JsonRequestBehavior.AllowGet);
}

我尝试了result = studiesresult = studiesPagedresult = studiesCount var data = Newtonsoft.Json.JsonConvert.SerializeObject(result, ...)。只有studiesPaged给出错误。

我可以使用MultipleActiveResultSets=True;解决它,但是我在哪里进行第二个查询?

更新

public ActionResult GetStudies(int pageSize = 10, int pageNum = 1({ var studies = GetStudiesData((。ToList((;解决了,创造了另一个问题 其他代码}

现在返回的 Json 看起来像是 Json 再次序列化为字符串。

"{'"TotalRows'":5,'"Rows'":[{'"AssignedUser'":null, ..... }]}"

当被javascript解析时,它全部被拆分为一个字符数组。

更新2

改变

//data is a json string after serialization
return Json(data, JsonRequestBehavior.AllowGet); //Serializing the Json

return Content(data, "application/json");

JSON 序列化中的错误“已有一个与此命令关联的打开的数据读取器”

将其分配给列表,然后查询它应该可以防止这种情况:

public ActionResult GetStudies(int pageSize = 10, int pageNum = 1)
{
    var studies = GetStudiesData().ToList();
    var studiesCount = studies.Count();
    var studiesPaged = studies.OrderBy(s=>s.PatientID).Skip(pageSize*pageNum).Take(pageSize);
    var result = new { TotalRows = studiesCount, Rows = studiesPaged };
    //this line gives error
    //There is already an open DataReader associated with this Command which must be closed first.
    var data = Newtonsoft.Json.JsonConvert.SerializeObject(result, Newtonsoft.Json.Formatting.None,
    new Newtonsoft.Json.JsonSerializerSettings()
    {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    });
    return Json(data, JsonRequestBehavior.AllowGet);
}
var assignedStudies = db.Studies.Where(s => s.AssignedUserID == currUser.Id);
studies = db.Studies.Where(s => s.User.CenterId == currUser.CenterId && 
              s.RoleID == currUserRole.RoleId).Concat(assignedStudies);

您有两个查询要在此处DbSet<Studies>