c# - EF Core - 从 SQL 视图加载的导航属性
问题描述
我有以下实体:
public class Animal
{
public int Id { get; set; }
public string Name { get; set; }
/// <summary>
/// Current Animal Status
/// </summary>
public virtual AnimalStatus CurrentAnimalStatus
{
get { return AnimalStatuses.OrderByDescending(x => x.VersionNo).First(); }
}
/// <summary>
/// List of all Animal Statuses
/// </summary>
public virtual ICollection<AnimalStatus> AnimalStatuses { get; set; }
/// <summary>
/// List of all Animal Operations
/// </summary>
public virtual ICollection<AnimalOperation> AnimalOperations { get; set; }
}
和
public class AnimalStatus
{
public int Id { get; set; }
public int VersionNo { get; set; }
public int BloodCount { get; set; }
public int AnimalId { get; set; }
public virtual Animal Animal { get; set; }
}
我只对最近的感兴趣,AnimalStatus
所以想使用 View 来填充CurrentAnimalStatus
属性并消除对ICollection<AnimalStatus>
. 实体的其余部分Animal
应由 EF 核心填充。
目前该AnimalStatus
表包含 300,000 条记录,因此使用 EF Core 非常慢
_dbContext.Animal.Include(x => x.AnimalStatus);
在 EF Core 中是否可以从 SQL 视图中填充实体上的导航属性?
CREATE VIEW [dbo].[CurrentAnimalStatusView]
AS
WITH ANIMAL_EVENTS_CTE AS
(
SELECT
AnimalId,
BloodCount,
ROW_NUMBER() OVER (PARTITION BY AnimalId ORDER BY VersionNo DESC) AS RowNumber --RowNumber = 1 indicates the latest status
FROM
AnimalBloodTests
)
SELECT
AnimalId,
BloodCount
FROM
ANIMAL_EVENTS_CTE cte
WHERE
RowNumber = 1 --Only interested in latest status for each AnimalId
解决方案
您可以为您的视图创建一个模型并将其映射到 Dbset。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<CurrentAnimalStatus>(eb =>
{
eb.HasNoKey();
eb.ToView("CurrentAnimalStatusView");
});
base.OnModelCreating(modelBuilder);
}
推荐阅读
- python - 抓取谷歌头条突然停止工作
- unit-testing - 如何使用 jasmine 为以下 TS 函数编写单元测试用例
- azure - Azure 表存储 REST 查询不显示新条目
- javascript - ES6 解构——这是做什么的?
- sql-server - 在 CONCAT 中嵌入 CASE
- magnolia - magnolia cms 中页面的新导出操作
- typescript - Typescript:获取更多具有通用参数的函数签名的有针对性的返回类型
- azure-service-fabric - 如何使用 powershell 更新服务结构应用程序参数
- angular - Angular 是否使用浏览器的 History API 进行路由?
- excel - 对相应列求和并删除重复项而不更改 sheet1 中的数据(VBA)