Ad esempio, ho tale modello:
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public BlogImage BlogImage { get; set; }
}
public class BlogImage
{
public int BlogImageId { get; set; }
public byte[] Image { get; set; }
public string Caption { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
Voglio tornare in vista ImageView URL e immagine.
Dove devo creare e definire quella vista SQL?
In Entity Framework Core 2.1 possiamo usare i tipi di query come suggerito da Yuriy N.
Un articolo più dettagliato su come usarli può essere trovato qui
L'approccio più diretto secondo gli esempi dell'articolo sarebbe:
1. Abbiamo ad esempio i seguenti modelli di entità per gestire le pubblicazioni
public class Magazine
{
public int MagazineId { get; set; }
public string Name { get; set; }
public string Publisher { get; set; }
public List<Article> Articles { get; set; }
}
public class Article
{
public int ArticleId { get; set; }
public string Title { get; set; }
public int MagazineId { get; set; }
public DateTime PublishDate { get; set; }
public Author Author { get; set; }
public int AuthorId { get; set; }
}
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
public List<Article> Articles { get; set; }
}
2. Abbiamo una vista chiamata AuthorArticleCounts, definita per restituire il nome e il numero di articoli scritti da un autore
SELECT
a.AuthorName,
Count(r.ArticleId) as ArticleCount
from Authors a
JOIN Articles r on r.AuthorId = a.AuthorId
GROUP BY a.AuthorName
3. Andiamo a creare un modello da utilizzare per la vista
public class AuthorArticleCount
{
public string AuthorName { get; private set; }
public int ArticleCount { get; private set; }
}
4. Successivamente creiamo una proprietà DbQuery nel mio DbContext per utilizzare i risultati della vista all'interno del modello
public DbQuery<AuthorArticleCount> AuthorArticleCounts{get;set;}
4.1. Potrebbe essere necessario sovrascrivere OnModelCreating () e impostare la vista, soprattutto se si dispone di un nome di vista diverso rispetto alla propria classe.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query<AuthorArticleCount>().ToView("AuthorArticleCount");
}
5.Infine possiamo facilmente ottenere i risultati della vista in questo modo.
var results=_context.AuthorArticleCounts.ToList();
AGGIORNAMENTO Secondo il commento di ssougnez
Vale la pena notare che DbQuery non sarà / non sarà più supportato in EF Core 3.0. Vedi qui
Le viste non sono attualmente supportate da Entity Framework Core. Vedi https://github.com/aspnet/EntityFramework/issues/827 .
Detto questo, puoi ingannare EF nell'usare una vista mappando la tua entità alla vista come se fosse una tabella. Questo approccio presenta delle limitazioni. ad esempio, non è possibile utilizzare le migrazioni, è necessario specificare manualmente una chiave per l'utilizzo di EF e alcune query potrebbero non funzionare correttamente. Per aggirare quest'ultima parte, è possibile scrivere manualmente query SQL
context.Images.FromSql("SELECT * FROM dbo.ImageView")