linq datetime не содержит max или min - PullRequest
0 голосов
/ 14 июля 2020

Я получаю сообщение об ошибке, что datetime не содержит метода max или min. Я пытаюсь получить максимальную и минимальную дату встречи и посмотреть, равны ли они, а затем установить для MeetingDate минимальную дату и время. Если они не равны, я объединю min StartDate и max StartDate вместе. ниже показано, как должен выглядеть результат, и я получаю сообщение об ошибке: datetime не содержит метода max или min.

class Program
    {
        static void Main(string[] args)
        {

            List<MeetingModel> Meeting = new List<MeetingModel>();

            Meeting.Add(new MeetingModel() { MeetingId = 1, startTime = new DateTime(2017, 1, 18) });
            Meeting.Add(new MeetingModel() { MeetingId = 1, startTime = new DateTime(2017, 1, 19) });
            Meeting.Add(new MeetingModel() { MeetingId = 2, startTime = new DateTime(2017, 1, 22) });
            Meeting.Add(new MeetingModel() { MeetingId = 2, startTime = new DateTime(2017, 1, 22) });
            Meeting.Add(new MeetingModel() { MeetingId = 3, startTime = new DateTime(2017, 1, 23) });
            Meeting.Add(new MeetingModel() { MeetingId = 3, startTime = new DateTime(2017, 1, 23) });
            Meeting.Add(new MeetingModel() { MeetingId = 4, startTime = new DateTime(2017, 1, 25) });
            Meeting.Add(new MeetingModel() { MeetingId = 4, startTime = new DateTime(2017, 1, 29) });


            var result =  Meeting
                          .Select (p=> new MeetingViewModel
                          {
                             MeetingId = p.MeetingId,
                             MeetingDate = p.startTime.Max() == p.startTime.Min() ? p.startTime.Min().ToString("MM/dd/yyyy") :
                                        string.Format("{0: MM/dd/yyyy} - {1: MM/dd/yyyy}", p.startTime.Min(), p.startTime.Max()
                          }).ToList();

            foreach (var meeting in result)
            {

                Console.WriteLine("{0}", meeting.MeetingId);
                Console.WriteLine("{0}", meeting.MeetingDate);
            }
        }


        class MeetingModel
        {
            public int MeetingId { get; set; }
            public DateTime startTime { get; set; }        
        }

        class MeetingViewModel
        {
            public int MeetingId { get; set; }
            public string MeetingDate { get; set; }
        }
    }

Ошибка

Код серьезности Описание Ошибка состояния подавления строки файла проекта Ошибка состояния CS1929 DateTime не содержит определения для Max, а для лучшей перегрузки метода расширения Enumerable.Max (IEnumerable) требуется получатель типа IEnumerable

введите описание изображения здесь

Выход

Meeting 1 2017/1/18 - 2017/1/19
Meeting 2 2017/1/22
Meeting 3 2017/1/23
Meeting 4 2017/1/25 - 2017/1/29

EF

select new Model.Meeting
                       {
                           MeetingId = m.MeetingId,
                           GroupId = m.GroupId,
                           MeetingDate = m.Min(x => x.startTime) == m.Max(x => x.startTime) ?
                                         m.Max(x => x.startTime).ToString("MM/dd/yyyy") :
                                        string.Format("{0: MM/dd/yyyy} - {1: MM/dd/yyyy}", 
                                        md.Min(x => x.startTime), md.Max(x => x.startTime))
                       }).GroupBy(x => x.MeetingId).ToList();

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете сгруппировать по MeetingId и использовать методы .Min и .Max linq для получения дат:

var result = Meeting
    .GroupBy(x => x.MeetingId)
    .Select(p => new MeetingViewModel
    {
        MeetingId = p.Key,
        MeetingDate = p.Min(x => x.startTime) == p.Max(x => x.startTime) ?
            p.Max(x => x.startTime).ToString("MM/dd/yyyy") :
            string.Format("{0: MM/dd/yyyy} - {1: MM/dd/yyyy}", p.Min(x => x.startTime), p.Max(x => x.startTime))
    }).ToList();

Тест в dotnetfiddle: https://dotnetfiddle.net/IJaehf

Надеюсь, вы найдете это полезным.

1 голос
/ 14 июля 2020

Пожалуйста, попробуйте DateTime.MinValue или SqlDateTime.MinValue. Они реализованы как static readonly поля, а не методы.

...