Это самое простое, что я могу придумать:
var tasksWithSegments =
from segment in model.TimeSegments
where segment.Date.Month == month
where segment.Employee.Id == employeeId
group segment by segment.Task into result
select new
{
Task = result.Key,
TimeSegments = result.ToArray()
};
Обратите внимание, что вам может потребоваться добавить некоторые свойства в вашу модель, например Model.TimeSegment
и TimeSegment.Task
.
Трюк с LINQ-запросами часто заключается в том, чтобы начать с правильной коллекции.В этом случае идеальной отправной точкой является TimeSegments
.
пс.Я не уверен, будет ли Date.Month == month
действительно работать с EF, но я думаю, что это будет работать (с EF 4.0, который есть).
Обновление:
Не могли бы вы показать, как расширить этот запрос и получить задачи для конкретного клиента?
Я не уверенчто вы имеете в виду, но вы можете, например, отфильтровать предыдущий запрос, как это:
var tasksWithSegmentsForCustomers =
from taskWithSegments in tasksWithSegments
where taskWithSegments.Task.Customer.Id == customerId
select taskWithSegments;
Могу ли я получить тип возвращаемого значения в виде списка задач со списком TimeSegment, если у меня этометод?
Опять же, вы не уверены, чего именно хотите, но если вам нужны два отдельных списка, которые не имеют отношения, вы можете сделать это:
List<Task> tasks = (
from taskWithSegments in tasksWithSegments
select taskWithSegments.Task).ToList();
List<TimeSegments> segments = (
from taskWithSegments in tasksWithSegments
from segment in taskWithSegments.Segments
select segment).ToList();
Конечно,если это то, что вам нужно, то может быть проще переписать исходный запрос примерно так:
List<TimeSegment> segments = (
from segment in model.TimeSegments
where segment.Date.Month == month
where segment.Employee.Id == employeeId
select segment).ToList();
List<Task> allTasks =
segments.Select(s => s.Task).Distinct().ToList();
Как только вы научитесь писать запросы LINQ, вы не сможете вернуться назад.писать операторы SQL или устаревшие операторы foreach.
Подумайте, LINQ !!!