Attualmente sto sviluppando un'API con core di base ASP.NET ed Entity con npgsql come provider di database. Ho due entità e hanno una relazione uno a molti. Il fatto è che voglio solo includere l'ID dell'entità figlio nel risultato JSON restituito da "Controller padre".
Queste sono le mie entità:
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; }
}
Tuttavia non sono sicuro su come raggiungere questo obiettivo. Ieri mi sono imbattuto in un'altra domanda SO che suggeriva qualcosa del genere:
public IActionResult Meals () {
var meal = this.context.Meals
.Include(m => m.Pictures.Select(p => p.Id))
.First();
return new JsonResult(meal);
}
Questo tuttavia lancia una InvalidOperationException. Il mio DbContext è molto semplice, non onModelConfiguring perché questo codice segue la convenzione per quanto ne so e ha solo due DbSet dei tipi corrispondenti. Anche le chiavi esterne sono corrette nel database e chiamano qualcosa come:
var pictures = dbContext.Pictures.Where(p => p.MealId == mealId).ToList();
Funziona come previsto. Ho incluso solo il codice che pensavo fosse pertinente. Se ne è necessario di più lo includerò, ma penso che questa sia completamente la mia comprensione limitata delle domande.
Grazie per il tuo tempo!
Non è necessario modificare la struttura del DB, una delle opzioni è la seguente:
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();
Puoi fare la stessa cosa anche con lambda usando il metodo "Select", Linq in queste cose mi sembra più intuitivo, comunque, a ciascuno dei suoi ... questa è la tua scelta.
Probabilmente c'è una risposta migliore, ma è così che ho risolto. Includere l'intera classe Picture
non era un'opzione in quanto verrebbero inclusi anche i dati binari e non volevo interrogare il server per i dati senza usarlo, dal momento che è una chiamata costosa al database.
Quindi quello che ho fatto è mettere i dati binari in un'altra classe chiamata PictureFile
(è necessario pensare a un nome migliore, ma solo File
era ovviamente un'opzione). La classe PictureFile
ha solo un riferimento all'immagine corrispondente e una matrice di byte con i dati dell'immagine. In questo modo puoi includere le Pictures
in un Meal
senza ottenere i file reali. Il cliente può poi decidere quali immagini ha bisogno e richiederle tramite PictureId
.