Создание серии DateTime в месяцах с использованием C# и Entity Framework - PullRequest
0 голосов
/ 28 мая 2020

Я новенький ie. Это моя модель сущности.

''' public virtual DateTime StartDate { get; set; }

    [Required]
    public virtual string Name { get; set; }
    [Column(TypeName = "money")]
    public virtual decimal SalesAmount { get; set; }
    [Column(TypeName = "money")]
    public virtual decimal CostofSales { get; set; }


    [Column(TypeName = "money")]
    public virtual decimal GrossProfit { get { return SalesAmount - CostofSales; } }

    public virtual int Months { get; set; }

    public virtual DateTime EndDate { get {return StartDate.AddMonths(Months); } } '''

Теперь я хочу убедиться, что когда пользователь вводит дату начала и месяцы, на которые он хочет спроецировать, моя база данных будет заполнена месяцами между датой начала и датой окончания. . Это означает, что мне нужен способ создания ежемесячных временных рядов дат, которые они затем могут использовать для создания прогнозов продаж на ежемесячной основе в течение установленного ими периода. Пожалуйста, помогите или укажите мне аналогичное решение, которое может помочь

1 Ответ

0 голосов
/ 31 мая 2020

Не стоит ставить лог c в модели EF. Модели EF просто используются для сопоставления объектов с таблицами базы данных. в виде расчетов (например, GrossProfit). GrossProfit можно рассчитывать на лету, а не сохранять в базе данных. Все бизнес-логики c должны выполняться в объектах передачи данных (DTO). Создайте еще один набор моделей (DTO), который будет использоваться для преобразования данных на основе бизнес-правил. Это модели, которые вы можете вернуть клиенту:

    public class SalesProjectionDTO
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public decimal SalesAmount { get; set; }

        public decimal CostofSales { get; set; }

        public decimal GrossProfit { get; set; }
    }

Затем, если вы используете Entity Framework:

public List<SalesProjectionDTO> GetProjectionsByDateRange(int startMonth, int endMonth) 
{
     var projections = _context.SalesProjection
       .Where(sp => sp.SalesProjectionMonths
                      .Any(m => m.Month >= startMonth && m.Month <= endMonth))
       .Select(sp => new SalesProjectionDTO {
               Name = sp.Name,
               SalesAmount = sp.SalesAmount,
               CostOfSales = sp.CostOfSales,
               GrossProfit = sp.SalesAmount - sp.CostOfSales
         }).ToList();

     return projections;
}

public void SaveProjections(SalesProjectionDTO projection, int startMonth, int endMonth)
{
     //check if projection exists
     var entity= _context.SalesProjection.Where(sp => sp.Id == projection.Id)
           .FirstOrDefault() ?? new SalesProjection();

     if (entity== null)
         _context.Add(projection);

     entity.Name = projection.Name;
     entity.SalesAmount = projection.SalesAmount;
     entity.CostOfSales = projection.CostOfSames;

     for (var i = startMonth; i <= endMonth; i++){
          entity.ProjectionMonths.Add(
               new ProjectionMonth { 
                    Month = i;
               }
     }

     _context.SaveChanges();
}
...