簡體   English   中英

序列化錯誤 ASP.NET Web API

[英]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.

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