【问题标题】:How to convert EF List objects to an arrayList of type dateTime如何将 EF List 对象转换为 dateTime 类型的 arrayList
【发布时间】:2017-12-31 07:22:30
【问题描述】:

我正在处理请假申请。我需要获取排除的日期并将其转换为 dateTime 数组。

我使用以下方法部分实现了这一点。我创建了一个 Helper 文件夹,然后将以下类添加到该文件夹​​中:

namespace eLeave.Helpers
{
    public class BusinessDaysCalculator
    {
        public int Calculate(DateTime startDate, DateTime endDate, DateTime[] holidays)
        {
            startDate = FixStartDate(startDate);
            endDate = FixEndDate(endDate.Date);

            if (startDate > endDate)
                return 0;
            else
                return CalculateDifference(startDate, endDate, holidays);
        }



        private int CalculateDifference(DateTime startDate, DateTime endDate, DateTime[] holidays)
        {
            int difference = (int)(endDate - startDate).TotalDays;
            int weeks = difference / 7;
            if (endDate.DayOfWeek < startDate.DayOfWeek) weeks++;
            difference -= weeks * 2;
            difference -= HolidayCount(startDate, endDate, holidays);
            return difference + 1;
        }



        private int HolidayCount(DateTime startDate, DateTime endDate, DateTime[] holidays)
        {
            int holidayCount = 0;
            foreach (DateTime holiday in holidays)
            {
                if (HolidayInRange(startDate, endDate, holiday))
                    holidayCount++;
            }
            return holidayCount;
        }



        private DateTime FixStartDate(DateTime date)
        {
            if (date.DayOfWeek == DayOfWeek.Sunday)
                date = date.AddDays(1);
            else if (date.DayOfWeek == DayOfWeek.Saturday)
                date = date.AddDays(2);
            return date.Date;
        }



        private bool HolidayInRange(DateTime startDate, DateTime endDate, DateTime holiday)
        {
            return (holiday >= startDate
                && holiday <= endDate
                && holiday.DayOfWeek != DayOfWeek.Saturday
                && holiday.DayOfWeek != DayOfWeek.Sunday);
        }



        private DateTime FixEndDate(DateTime date)
        {
            if (date.DayOfWeek == DayOfWeek.Sunday)
                date = date.AddDays(-2);
            else if (date.DayOfWeek == DayOfWeek.Saturday)
                date = date.AddDays(-1);
            return date.Date;
        }
    }
}

我像下面这样实例化了这个类,并将excludedDate 传递给它,如下所示:

// Get the Excluded dates
var excludedDates = _context.ExcludedDate.Where(d=>d.ExcludedDates >= StartDate).Where(d=>d.ExcludedDates <= EndDate).ToArray();

BusinessDaysCalculator calc = new BusinessDaysCalculator();
int days = calc.Calculate(StartDate, EndDate, excludedDates);    

该实现本来可以工作,但出现错误,但尝试使用下面的 holidays DateTime 数组时

   DateTime[] holidays = new DateTime[3];
   holidays[0] = new DateTime(2017, 08, 15);
   holidays[1] = new DateTime(2017, 09, 1);    

我在上面的 holiday 数组中得到了排除日期的休假天数

我需要获取 excludeDates 的值并将其与我的班级一起使用以使其工作。

我在这里遇到的错误如下:

Error   1   The best overloaded method match for 'eLeave.Helpers.BusinessDaysCalculator.Calculate(System.DateTime, System.DateTime, System.DateTime[])' has some invalid arguments  C:\Apps\WebApplications\eLeave\eLeave\eLeave\Controllers\RequestController.cs   100 32  eLeave


Error   2   Argument 3: cannot convert from 'eLeave.Models.ExcludedDate[]' to 'System.DateTime[]'   C:\Apps\WebApplications\eLeave\eLeave\eLeave\Controllers\RequestController.cs   100 67  eLeave

排除日期型号如下:

public class ExcludedDate
{
    public byte Id { get; set; }
    public DateTime? ExcludedDates { get; set; }
}

【问题讨论】:

  • 不清楚您的要求。使用 .ToArray() 确实会将其转换为数组
  • @StephenMuecke:我已将问题编辑得更具体。
  • 但它已经是DateTime[] - 这就是.ToArray() 所做的
  • @StephenMuecke 我将这些值传递给了以下函数 BusinessDaysCalculator calc = new BusinessDaysCalculator(); 中的参数。 int days = calc.Calculate(StartDate, EndDate, excludeDates);我遇到了错误...我将不得不更新我的问题以包括我的助手类,以便您有更多的理解。
  • @StephenMuecke 我已经编辑了问题以包含我使用的类

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-3 entity-framework-4 entity-framework-6


【解决方案1】:

您的查询返回一个不是DateTime 类型的ExcludedDate 类的数组 - 您需要一个.Select() 子句来仅选择对象的ExcludedDates 属性。

将查询更改为

DateTime[] excludedDates = _context.ExcludedDate
    .Where(d=>d.ExcludedDates >= StartDate && d.ExcludedDates <= EndDate)
    .Select(x => x.ExcludedDates)
    .ToArray();

请注意,不清楚为什么您的属性可以为空(该属性的 null 值没有意义,并且名称与表名的关系有点混乱。我建议您将其更改为 @987654327 @

【讨论】:

  • @StephenMueke:我会做出必要的调整。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多