如何在存储库模式中调用 Db 视图文件?

How to call Db view file in repository pattern?

我正在 SQL 服务器中创建一个视图文件,如下图所示。

我创建了一个模型来从这个视图中获取结果:

public class FactALLCousumption : BaseEntity, IAggregateRoot
{

    public double sumActiveImportTotal { get;  set; }
    public DateTime hour { get;  set; }
    public int fullDateAlternateKey { get;  set; }
}

但我无法在我的存储库中调用此视图。我的存储库代码如下:

public class FactCousumptionRepository: GenericRepository<FactCousumption>, IFactCousumptionRepository
{
    public DbContext _dbContext;

    public FactCousumptionRepository(BaseDbContext context) : base(context)
    {
        _dbContext = context;           
    }

    public async Task<FactALLCousumption> GetTotalAllCousumption()
    {

    }
}

在 EF Core 2.2 或 2.1 中,您可以使用查询类型。

根据截图和你提供的View要使用的模型,我做了一个简单的工作demo如下,你可以参考修改:

1.Model

 public class FactCousumption
{
    public int Id { get; set; }
    public double SumActiveImportTotal { get; set; }
    public int DateKeyId { get; set; }
    [ForeignKey("DateKeyId")]
    public Dim_Date Dim_Date { get; set; }
    public int TimeAltKeyId { get; set; }
    [ForeignKey("TimeAltKeyId")]
    public Dim_Time Dim_Time { get; set; }
    public int TariffKeyId { get; set; }
    [ForeignKey("TariffKeyId")]
    public Dim_Tariff Dim_Tariff { get; set; }
}

public class Dim_Date
{
    [Key]
    public int DateKey { get; set; }
    public int FullDateAlternateKey { get; set; }
    public DateTime Date { get; set; }
    public ICollection<FactCousumption> FactCousumptions { get; set; }
}

public class Dim_Time
{
    [Key]
    public int TimeAltKey { get; set; }
    public DateTime Hour { get; set; }
    public ICollection<FactCousumption> FactCousumptions { get; set; }
}
 public class Dim_Tariff
{
    [Key]
    public int TariffType { get; set; }
    public string TariffName { get; set; }

    public ICollection<FactCousumption> FactCousumptions { get; set; }
}

2.CreateSQL查看

CREATE VIEW [dbo].[View1]
AS  SELECT SUM(FactCousumption.SumActiveImportTotal) AS consumption ,Dim_Time.HOUR,Dim_Date.FullDateAlternateKey,Dim_Tariff.TariffName
  FROM FactCousumption INNER JOIN
        Dim_Date ON FactCousumption.DateKeyId = Dim_Date.DateKey INNER JOIN
        Dim_Time ON FactCousumption.TimeAltKeyId=Dim_Time.TimeAltKey INNER JOIN
        Dim_Tariff ON FactCousumption.TariffKeyId=Dim_Tariff.TariffType
  GROUP BY Dim_Date.FullDateAlternateKey, Dim_Time.HOUR ,Dim_Tariff.TariffName

3.The 模型,用于视图,注意:模型中的属性名称应与视图中的名称一致

public class FactALLCousumption
{
    public double consumption { get; set; }
    public DateTime hour { get; set; }
    public int fullDateAlternateKey { get; set; }
}

4.DbContext,在我的 DbContext 中创建一个 DbQuery 属性 以使用模型内的视图结果并设置视图,尤其是当您的视图名称与 Class 不同时。

 public DbQuery<FactALLCousumption> FactALLCousumption { get; set; }

 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Query<FactALLCousumption>().ToView("View1");
 }

5.Finally这样就可以轻松得到View的结果

public async Task<FactALLCousumption> GetTotalAllCousumption()
{
        var result = await _context.FactALLCousumption.FirstOrDefaultAsync();

        return result;
}

注意:值得注意的是,EF Core 3.0 将不再be/is 支持 DbQuery。参见 here