Как вызвать файл Db view в шаблоне репозитория? - PullRequest
0 голосов
/ 15 февраля 2020

Я создаю файл вида на SQL Сервере, как показано на рисунке ниже.

enter image description here

, и я создал модель для получения результатов из этого представления:

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()
    {

    }
}

1 Ответ

0 голосов
/ 17 февраля 2020

В EF Core 2.2 или 2.1 вы можете использовать типы запросов.

В соответствии со снимком экрана и моделью, которую вы будете использовать для представленного вами представления, я делаю простую рабочую демонстрацию, как показано ниже. и внести изменения в соответствии с вашим требованием:

1.Модель

 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.Создать SQL Вид

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.Модель, которая является обратите внимание: имя свойства в модели должно совпадать с именем в представлении

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

4.DbContext, создайте свойство DbQuery в моем DbContext, чтобы использовать результаты представления внутри модели, и установите вверх, особенно если у вас другое имя, чем у вашего класса.

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

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

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

5. Наконец, вы можете легко получить результаты вида, как это.

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

        return result;
}

Примечание : Стоит отметить, что DbQuery больше не будет / не поддерживается в EF Core 3.0. Смотрите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...