Lambda Query GroupBy с логическими значениями

У меня есть несколько случаев, когда мне нужно вернуть список данных, который использует .GroupBy, В дополнение к датам и целым числам мне также нужно возвращать логические значения, что я не могу сделать. Пример модели:

public class HolidayCheckList
{
    public DateTime startDate { get; set; }
    public DateTime endDate { get; set; }
    public int stafferId { get; set; }
    public bool startTime { get; set; }
    public bool endTime { get; set; }
}

Ниже приведен контроллер, как это в настоящее время:

var model = _db.AnnualLeaves
    .Where(r => r.StartDate <= tTE && r.EndDate >= tTS)
    .GroupBy(r => r.tBooked) 
    .Select(m => new HolidayCheckList
    {
        startDate = m.Max(r => r.StartDate),
        endDate = m.Max(r => r.EndDate),
        stafferId = m.Min(r => r.StafferId)
    });

    return View(model.ToList());

Это делает то, что мне нужно. Однако в дополнение к startDate а также endDate Мне нужно вернуть startTime а также endTime, которые являются логическими значениями, для просмотра. Я не знаю, нужен ли мне агрегатный оператор, о котором я не знаю, необходимо включить в .GroupBy оператор или, возможно, нужен вложенный запрос. Без сомнения, это будет намного проще.

Я подумал об изменении типа данных на целое число, но хотел бы знать, есть ли способ сделать это "правильно".

Кроме того, есть ли учебный ресурс или документация для лямбда-запросов? Я могу найти основную информацию, но ничего такого, как подробно .GroupBy работает, или каковы агрегатные операторы.

1 ответ

Решение

Если вы уверены, что все startTime а также endTime значения будут одинаковыми (или вам все равно), вы можете использовать .First выбрать первый элемент в группе startTime а также endTime ценности:

var model = _db.AnnualLeaves
    .Where(r => r.StartDate <= tTE && r.EndDate >= tTS)
    .GroupBy(r => r.tBooked) 
    .Select(m => new HolidayCheckList
    {
        startDate = m.Max(r => r.StartDate),
        endDate = m.Max(r => r.EndDate),
        stafferId = m.Min(r => r.StafferId),
        startTime = m.Select(r => r.StartTime).First(),
        endTime = m.Select(r => r.EndTime).First()
    });

Хорошим ресурсом для лямбд является статья Lambda Expressions на MSDN.

Агрегирование операций выглядит как хороший обзор различных агрегатных операций, доступных в LINQ. К сожалению, примеры есть в VB.NET.

Другие вопросы по тегам