Проблема с вашим старым запросом часто называется n + 1 проблемой .
Вы должны иметь возможность адаптировать исходный запрос следующим образом:
var query = (from c in session.db.TimesheetAttributes
from cr in c.TimesheetRows
where ((c.Active == true)
&& (c.Timesheet.Active == true)
&& (c.ValidFrom <= validDate)
&& (c.ValidTo > validDate)
&& (c.Timesheet.ContactPersonId == session.ContactPersonAttributes.ContactPersonId))
select new
{
Id = c.TimesheetId,
c.Date,
WeekDay = c.Date.ToString("dddd", new CultureInfo("pl-PL")),
Description = String.Format("{0:dd/MM/yyyy}", c.Date),
Hours = String.Format("{0:HH:mm}", (new DateTime((cr.Aggregate(TimeSpan.Zero, (subtotal, t) => subtotal + (t.DateTo - t.DateFrom)).Ticks)))),
c.SickNote,
c.Vacation,
c.OccasionVacation
}).OrderBy(c => c.Date).ToList();
Если это все еще гудит, вы можете попробовать добавить тенарный оператор в свойство Hours ...
Hours = String.Format("{0:HH:mm}", !(cr == null) && cr.Any() ? (new DateTime((cr.Aggregate(TimeSpan.Zero, (subtotal, t) => subtotal + (t.DateTo - t.DateFrom)).Ticks))) : DateTime.MinValue
EDIT:
Теперь я понимаю, что вы имеете в виду, мой мозг еще не совсем проснулся. Проблема, с которой вы столкнулись, заключается в том, что основной поставщик запросов не замечает, что ему нужно извлечь TimesheetAttributes И связанные / связанные TimesheetRows. Вероятно, это связано с тем, что TimesheetRows глубоко скрыты в выражении, которое генерирует выбранные вами анонимные типы.
Синтаксис моего запроса не блестящий (я предпочитаю делать это в лямбде - я чувствую, что это больше будущее , но это всего лишь ощущение), но я попробую ...
var query = (from res in
(from c in session.db.TimesheetAttributes
where ((c.Active == true)
&& (c.Timesheet.Active == true)
&& (c.ValidFrom <= validDate)
&& (c.ValidTo > validDate)
&& (c.Timesheet.ContactPersonId == session.ContactPersonAttributes.ContactPersonId))
select new
{
c = c,
cr = c.TimesheetRows
})
select new
{
Id = c.TimesheetId,
c.Date,
WeekDay = c.Date.ToString("dddd", new CultureInfo("pl-PL")),
Description = String.Format("{0:dd/MM/yyyy}", c.Date),
Hours = String.Format("{0:HH:mm}", (new DateTime((cr.Aggregate(TimeSpan.Zero, (subtotal, t) => subtotal + (t.DateTo - t.DateFrom)).Ticks)))),
c.SickNote,
c.Vacation,
c.OccasionVacation
}).OrderBy(c => c.Date).ToList();
Это выглядит уродливее, чем оригинал, и я уверен, что есть лучший способ сделать это, но оно должно сделать выражение достаточно ясным для вашего поставщика запросов (L2S или что-то еще), чтобы понять, что ему нужно вернуть обе сущности, и избежать проблемы n + 1.