[英]Serialization Error ASP.NET Web API
我有兩個模型類 State 和 City
public partial class State
{
public State()
{
this.City = new HashSet<City>();
}
public int State_Id { get; set; }
public string State_Name { get; set; }
public virtual ICollection<City> City { get; set; }
}
public partial class City
{
public int City_Id { get; set; }
public string City_Name { get; set; }
public int State_Id { get; set; }
public virtual State State { get; set; }
}
我的 DTO_State 類如下,用於狀態數據傳輸對象
public class DTO_State
{
public int State_Id { get; set; }
public string State_Name { get; set; }
public ICollection<int> City_Id { get; set; }
}
在StateController中我的Get動作方法如下
里面的這段代碼給了我序列化錯誤
public IQueryable<DTO_State> GetState()
{
var dstates = from S in db.State select new DTO_State()
{
State_Id = S.State_Id,
State_Name=S.State_Name,
City_Id = S.City.Select(x => x.City_Id).ToList()
};
return dstates.AsQueryable();
}
但是如果我用這個替換它,那么我會在瀏覽器中得到正確的數據
public IQueryable<DTO_State> GetState()
{
List<DTO_State> dstates = new List<DTO_State>();
IQueryable<State> states = db.State;
foreach (State S in states)
{
DTO_State dstate = new DTO_State();
dstate.State_Id = S.State_Id;
dstate.State_Name = S.State_Name;
dstate.City_Id = S.City.Select(x => x.City_Id).ToList();
dstates.Add(dstate);
}
return dstates.AsQueryable();
}
編輯:在下面的截圖中 State,City,DTO_State 與 New_State,New_City 和 DTO_New_State 相同,所以請不要混淆
在這里,我將展示第一個錯誤代碼在調試視圖中會發生什么
當光標在狀態上時會發生這種情況
當光標懸停在 dstates 上時,會發生這種情況
現在,即使存在多線程,dstates 也應該通過 know 進行評估,但事實並非如此
現在對於正確的代碼屏幕截圖如下從調試中我觀察到當 LINQ 查詢在每次將光標指向狀態變量的迭代中執行時,它的計數增加一,因此每當需要狀態變量的下一個值時,它是通過一些多線程機制(共有5種狀態)
在下圖中此時調試狀態和 dstates 都被填充
在瀏覽器中正確輸出
所以簡而言之,我不知道 LINQ Query 是否不支持多線程或其他原因,因為 WebAPI 內部執行多線程,所以請在這里幫助我
使用.AsEnumerable()
或.ToList()
而不是.AsQueryable()
。 或者在你的 LINQ 查詢和.AsQueryable()
如果你不能控制你正在實現的接口
public IQueryable<DTO_State> GetState()
.ToList()、.AsEnumerable()、AsQueryable() 之間有什么區別? 將有助於解釋機制。
AsEnumerable 經常用於從任何 IQueryable 實現切換到 LINQ to objects (L2O)
查看錯誤消息后,看起來像 EF 中的錯誤。 調用 ToList() 時內部 LINQ 查詢異常
您必須將 ICollection of Cities 更改為 IEnumerable。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.