簡體   English   中英

Json序列化錯誤“此命令已存在一個打開的DataReader”

[英]Error in Json Serialization “There is already an open DataReader associated with this Command”

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 = studiesCountvar data = Newtonsoft.Json.JsonConvert.SerializeObject(result, ...) 只有studiesPaged給出了錯誤。

我可以使用MultipleActiveResultSets=True;來解決它MultipleActiveResultSets=True; 但是我在哪里進行第二次查詢?

更新

公開ActionResult GetStudies(int pageSize = 10,int pageNum = 1){var Studies = GetStudiesData()。ToList(); //解決,創建了另一個問題//其他代碼}

現在,返回的Json看起來像是再次將Json序列化為字符串。

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

當由javascript解析時,它們全部拆分為一個字符數組。

UPDATE2

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

return Content(data, "application/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>有兩個查詢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM