Я делаю календарь, чтобы облегчить себе жизнь, я разбиваю встречи на несколько недель.
Например, с 1 января по 31 января, например, 6 недель (в моем календаре всегда 42 ячейки - 6 на 7). Таким образом, в моей базе данных было бы 6 строк.
Однако кое-что я требую от меня, чтобы собрать все эти ряды обратно в один ряд. Например, если я хочу экспортировать свой календарь в формате Ical.
У меня есть поле в моей базе данных с именем bindingClassName, все эти строки получают одинаковый идентификатор unquie для этой группы задач, поэтому я могу легко получить все недели.
// get all of the task rows by binding class name.
var found = plannerDb.Calendars.Where(u => u.UserId == userId && u.BindingClassName == bindingClassName)
.GroupBy(u => u.BindingClassName);
List<Calendar> allAppoingments = new List<Calendar>();
// go through each of the results and add it to a list of calendars
foreach (var group in found)
{
foreach (var row in group)
{
Calendar appointment = new Calendar();
appointment.AppointmentId = row.AppointmentId;
appointment.AllDay = row.AllDay;
appointment.BindingClassName = row.BindingClassName;
appointment.Description = row.Description;
appointment.EndDate = row.EndDate;
appointment.StartDate = row.StartDate;
appointment.Title = row.Title;
appointment.Where = row.Where;
appointment.UserId = row.UserId;
allAppoingments.Add(appointment);
}
}
// order
var test = allAppoingments.OrderBy(u => u.StartDate);
var firstAppointment = test.First();
var LastAppointment = test.Last();
Calendar newAppointment = new Calendar();
newAppointment.UserId = firstAppointment.UserId;
newAppointment.Description = firstAppointment.Description;
newAppointment.AllDay = firstAppointment.AllDay;
newAppointment.StartDate = firstAppointment.StartDate;
newAppointment.Title = firstAppointment.Title;
newAppointment.Where = firstAppointment.Where;
newAppointment.BindingClassName = firstAppointment.BindingClassName;
newAppointment.EndDate = LastAppointment.EndDate;
return newAppointment;
Так что в основном этот большой шарик находит все встречи с одинаковым обязательным именем. Затем я прохожу каждый из них и превращаю его в объект Calendar, а затем, наконец, после того, как все это сделано, я получаю первую и последнюю запись, чтобы получить startDate и endDate.
Так что я не очень хорошо разбираюсь в linq, но я не уверен, могу ли я просто добавить что-то после groupBy, чтобы делать то, что я хочу.
Edit.
Я пытаюсь сгруппировать все встречи, как только получу их от пользователя.
Итак, у меня есть это пока
Я пробовал что-то подобное.
var allApointments = calendar.GetAllAppointments(userId);
var group = allApointments.GroupBy(u => u.BindingClassName).Select(u => new Calendar()).ToList
Я надеялся, что это заполнит каждую группу автоматически, но это не так. Так что я не уверен, что снова не нужен групповой.
Edit @ admin
Привет, спасибо за объяснение сортировки и группировки. Как ты это объяснил, хотя кажется, что любой из них сработает.
Как и у вас есть код для получения первого и последнего свидания, прекрасно работает и делает то, что я хотел.
Я думаю, что группировка могла бы сработать, потому что, в конце концов, я ищу только одну строку с начальной датой первой записи и конечной датой последней записи, и вся остальная информация будет такой же.
Так что я не знаю, будет ли сложнее написать это или что, но, как я уже сказал, ваш запрос делает то, что я хочу.
Однако этот запрос используется на одной основе. Как будто я использую этот запрос только тогда, когда пользователь нажимает, чтобы просмотреть эту встречу в моем календаре. Нажав на встречу, я получаю всю информацию об этой встрече и о том, где мне нужно посмотреть, если эта задача охватывает несколько дней, и выяснить, когда встреча началась и когда она собирается закончиться.
Теперь мне нужен еще один запрос, и я думаю, что было бы лучше, если бы я мог на самом деле сгруппировать их, поскольку, как я понимаю из вашего объяснения, он будет составлять одну строку. Я думаю, что причина в том, что я хочу экспортировать все записи в таблице от этого пользователя.
Так что, если я упорядочу их в один блок продолжения по имени привязки, мне все равно понадобятся некоторые циклы, которые просматривают все записи и получают первую и начальную дату. Так что, если бы я мог просто сгруппировать его за один раз, и конечный результат был бы только одной записью для каждой группы имен привязок, и он имел бы первую дату начала и последнюю дату окончания из первой и последней записи, что было бы лучше. *