在Entity Framework Core中使用SQL視圖

c# entity-framework entity-framework-core

例如,我有這樣的模型:

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; }
} 

我想在ImageView視圖中返回UrlImage

我在哪裡需要創建和定義SQL視圖?

一般承認的答案

Entity Framework Core 2.1中,我們可以使用Yuriy N建議的查詢類型

有關如何使用它們的更詳細的文章可以在這裡找到

根據文章的例子,最直接的方法是:

1.我們有以下實體模型來管理出版物

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.我們有一個名為AuthorArticleCounts的視圖,定義為返回作者編寫的文章的名稱和數量

SELECT
  a.AuthorName,
  Count(r.ArticleId) as ArticleCount
from Authors a
  JOIN Articles r on r.AuthorId = a.AuthorId
GROUP BY a.AuthorName

3.我們去創建一個用於View的模型

public class AuthorArticleCount
{
  public string AuthorName { get; private set; }
  public int ArticleCount { get; private set; }
}

4.我們在DbContext中創建一個DbQuery屬性來使用Model中的視圖結果

public DbQuery<AuthorArticleCount> AuthorArticleCounts{get;set;}

5.最後,我們可以輕鬆地獲得View的結果。

var results=_context.AuthorArticleCounts.ToList();

熱門答案

Entity Framework Core目前不支持視圖。請參閱https://github.com/aspnet/EntityFramework/issues/827

也就是說,您可以通過將實體映射到視圖來欺騙EF使用視圖,就像它是一個表一樣。這種方法有局限性。例如,您無法使用遷移,您需要為我們手動指定EF的密鑰,並且某些查詢可能無法正常運行。要繞過最後一部分,您可以手動編寫SQL查詢

context.Images.FromSql("SELECT * FROM dbo.ImageView")


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow