簡體   English   中英

ASP.NET Core API 只返回列表的第一個結果

[英]ASP.NET Core API only returning first result of list

我創建了一個團隊 web api 控制器並嘗試調用 GET 方法來獲取數據庫中所有團隊的 json 結果。 但是當我撥打電話時,我只讓第一個團隊回到 json 中,但是當我在 return 語句上設置斷點時,它包含所有 254 個團隊以及所有游戲。

這是我正在處理的兩個模型:

public class Team
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Icon { get; set; }
    public string Mascot { get; set; }
    public string Conference { get; set; }
    public int NationalRank { get; set; }

    public List<Game> Games { get; set; }
}

public class Game
{
    public string Id { get; set; }
    public string Opponent { get; set; }
    public string OpponentLogo { get; set; }
    public string GameDate { get; set; }
    public string GameTime { get; set; }
    public string TvNetwork { get; set; }
    public string TeamId { get; set; }

    public Team Team { get; set; }
}

當我這樣做時:

[HttpGet]
public async Task<List<Team>> Get()
{
    var teams = await _context.Teams.ToListAsync();

    return teams;
}

我得到了所有 254 個團隊,但 Game 屬性為空,因為 EF Core 不支持延遲加載。 所以我真正想做的是像這樣添加 .Include() :

[HttpGet]
public async Task<List<Team>> Get()
{
    var teams = await _context.Teams.Include(t => t.Games).ToListAsync();

    return teams;
}

這將返回第一場比賽的第一支球隊,但沒有別的。 這是json:

[
  {
    "id": "007b4f09-d4da-4040-be3a-8e45fc0a572b",
    "name": "New Mexico",
    "icon": "lobos.jpg",
    "mascot": "New Mexico Lobos",
    "conference": "MW - Mountain",
    "nationalRank": null,
    "games": [
      {
        "id": "1198e6b1-e8ab-48ab-a63f-e86421126361",
        "opponent": "vs Air Force*",
        "opponentLogo": "falcons.jpg",
        "gameDate": "Sat, Oct 15",
        "gameTime": "TBD ",
        "tvNetwork": null,
        "teamId": "007b4f09-d4da-4040-be3a-8e45fc0a572b"
      }
    ]
  }
]

當我在 return 語句上設置斷點時,它顯示有 254 個團隊,每個團隊都正確填充了他們的游戲......但 json 結果沒有反映。 這是一張圖片:

在此處輸入圖片說明

我嘗試同步和異步執行此操作,但得到相同的結果。 你知道為什么我在 json 中只得到一個結果,但在斷點處它有所有結果嗎?

將此添加到Startup.cspublic void ConfigureServices(IServiceCollection services)方法:

services.AddMvc().AddJsonOptions(options => {
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        });

討論了這個問題https://github.com/aspnet/Mvc/issues/4160https://github.com/aspnet/EntityFramework/issues/4646也見循環參考

值得注意的是,如果您像使用內聯JsonSerializerSettings選項那樣控制 json 輸出,

[HttpGet]
public async Task<IActionResult> Get([FromForm]bool strip_nulls = true)
{
    var teams = await _context.Teams.Include(t => t.Games).ToListAsync();

    return Json(teams, new JsonSerializerSettings() { 
         NullValueHandling = strip_nulls ? NullValueHandling.Ignore : NullValueHandling.Include
    });
}

簡單地提出@adeam-caglin 的建議解決方案,這在方法上沒有錯,是行不通的。 您還必須在退貨中設置該設置。 例如。

[HttpGet]
public async Task<IActionResult> Get([FromForm]bool strip_nulls = true)
{
    var teams = await _context.Teams.Include(t => t.Games).ToListAsync();

    return Json(teams, new JsonSerializerSettings() { 
         NullValueHandling = strip_nulls ? NullValueHandling.Ignore : NullValueHandling.Include,
         ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    });
}

它基本上是空的,而不是添加到您在Startup.cs上設置的設置。 這也為您提供了一個路線圖,不要全局更改您的輸出,而是逐案進行。

編輯

我還想花點時間澄清一下當您使用ReferenceLoopHandling.Ignore時會發生什么,您要求從消防軟管中喝水,但希望它是受控的流量。 如果您有一個高度發達的建模,那么您可能會有一個集合,您認為您將在其中獲得預期的實體及其子列表,但是如果這些列表項也有子項或其他父項,那么您將加載它們。 讓我們說你有

Teams>Players>Contacts
Games>Teams

這會產生大量的 json 嵌套返回。 我本來想要一個扁平的Game>Teams但最終會得到Games>Teams>Players 這是一個簡單的示例,但很容易看出如何從幾 KB 的數據轉到永無止境的循環,從而扼殺了使用結果的客戶端。

這意味着你需要控制自己的流動。 要獲得預期的更平坦的 json 返回,您還需要在.Include(x => x.Games)上合並.AsNoTracking() .Include(x => x.Games)

作為一個非常簡單的示例,您需要執行以下操作:

[HttpGet]
public async Task<IActionResult> Get([FromForm]bool strip_nulls = true)
{
    var teams = _context.Teams.AsQueryable();
    teams = teams.Include(t => t.Games).AsNoTracking();
    Teams _return = await teams.ToListAsync();
    return Json(_return, new JsonSerializerSettings() { 
         NullValueHandling = strip_nulls ? NullValueHandling.Ignore : NullValueHandling.Include,
         ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    });
}

暫無
暫無

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

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