2016-08-04 108 views
3

我目前正在開發一個帶有npgsql作爲數據庫提供程序的ASP.NET核心和實體框架核心的API。我有兩個實體,他們有一對多的關係。問題是我只想在「父控制器」返回的JSON結果中包含子實體的Id。在實體框架核心中僅包含相關實體的Id

這是我的實體:

public class Meal { 
    public int Id { get; set; } 

    public string Title { get; set; } 
    public string Description { get; set; } 

    public string UserId { get; set; } 
    public User User { get; set; } 

    public List<Picture> Pictures { get; set; } 

    public Meal() { 
     this.Pictures = new List<Pictures>(); 
    } 
} 

public class Picture { 
    public int Id { get; set; } 

    public int MealId { get; set; } 
    public Meal Meal { get; set; } 

    public byte[] full { get; set; } 
    public byte[] small { get; set; } 
} 

不過,我不知道如何來實現這一目標。昨天我遇到了另一個SO問題,提示如下:

public IActionResult Meals() { 
    var meal = this.context.Meals 
     .Include(m => m.Pictures.Select(p => p.Id)) 
     .First(); 

    return new JsonResult(meal); 
} 

然而這會引發InvalidOperationException異常。 我的DbContext是非常基本的,沒有onModelConfiguring,因爲這個代碼遵循約定,據我所知,它只有兩個相應類型的DbSets。外鍵在數據庫中也是正確的,並且類似於:

var pictures = dbContext.Pictures.Where(p => p.MealId == mealId).ToList(); 

按預期工作。我只包括了我認爲相關的代碼。如果需要更多,我會包括它,但我認爲這完全是我對查詢的有限理解。

謝謝你的時間!

回答

1

你不需要改變你的數據庫結構,一種選擇是,像這樣:

 var db = this.context; 
     var result = (from meal in db.Meals 
         where meal.<whatever> == "123" 
         select new 
         { 
         Id = meal.Id, 
         Title = meal.Title, 
         Description = meal.Description, 
         //other required meal properties here. 
         PictureIds = meal.Pictures.Select(x => x.Id) 
         }).ToList(); 

您可以通過使用「選擇」的方法做經拉姆達同樣的事情爲好,中的LINQ這樣的事情看起來對我來說更直觀,然而,對於他自己......這是你的選擇。

+0

這看起來很完美。我會改回來,明天再試一試。謝謝! – larzz11

+0

很酷,讓我知道它是如何運作的,如果它幫助你確保你將它標記爲別人的答案,如果不是,發表評論,所以我不浪費別人的時間(儘管我知道它的權利)。 –

0

.Include(m => m.Pictures.Select(p => p.Id))將無法​​正常工作,你需要做的

.Include(m => m.Pictures) 

,這將讓你整個畫面模式的數組,您(所有屬性標識,MealId,..)和您的客戶端,你可以選擇ID來處理..

0

這裏可能有更好的答案,但這是我如何解決它。包括整個Picture類不是一個選項,因爲二進制數據也將包含在內,我不想在不使用數據的情況下向服務器查詢數據,因爲這對數據庫來說是一個昂貴的調用。

所以我所做的是把二進制數據放在另一個類PictureFile(需要想一個更好的名字,但只是File顯然不是一個選項)。類PictureFile只是具有對應的圖片和帶有圖片數據的字節數組的引用。這樣,您可以將Pictures包含在Meal中,而不必獲取實際的文件。客戶可以稍後決定它需要哪些圖片並通過PictureId來請求它們。