简体   繁体   English

EF Core - 从 SQL 视图加载的导航属性

[英]EF Core - Navigation Property loaded from SQL view

I have the following entities:我有以下实体:

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

and

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

I'm only ever interested in the most recent AnimalStatus so would like to use a View to populate just the CurrentAnimalStatus property and remove the need for ICollection<AnimalStatus> .我只对最近的AnimalStatus感兴趣,所以想使用 View 来填充CurrentAnimalStatus属性并消除对ICollection<AnimalStatus>的需要。 The rest of the Animal entity should be populated by EF core. Animal实体的 rest 应由 EF 内核填充。

Currently the AnimalStatus table holds 300,000 records so is very slow using EF Core with目前AnimalStatus表包含 300,000 条记录,因此使用 EF Core 非常慢

_dbContext.Animal.Include(x => x.AnimalStatus);

Is it possible in EF Core to have a navigation property on an entity be populated from a SQL view?是否可以在 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

You can create a model for your view and map it to Dbset.您可以为您的视图创建 model 并将 map 创建到 Dbset。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<CurrentAnimalStatus>(eb =>
    {
      eb.HasNoKey();
      eb.ToView("CurrentAnimalStatusView");
    });
  base.OnModelCreating(modelBuilder);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM