Моя модель:Как факторизовать запрос Linq с несколькими включенными?
- Несколько
DeviceStatus
прилагается к один обязательныйDevice
- Несколько
Device
прилагается к один обязательныйPanel
Когда я запрашиваю DeviceStatus
, мне нужно иметь Device
и Panel
прилагается к нему в результате запроса.
... DeviceStatus.Device имеет значение null в результате запроса.
Вот Linq запрос:
using (var actiContext = new ActigraphyContext())
{
var todayStatus =
from s in actiContext.DeviceStatus.Include(s1 => s1.Device.Panel)
where DbFunctions.TruncateTime(s.TimeStamp) == DbFunctions.TruncateTime(DateTimeOffset.Now)
&& s.Device.Panel.Mac == mac
&& (s.Device.Ty == 4 || s.Device.Ty == 9)
select s;
// var tempList = todayStatus.toList();
var todayLastStatus =
from s in todayStatus.Include(s1 => s1.Device.Panel)
let lastTimeStamp = todayStatus.Max(s1 => s1.TimeStamp)
where s.TimeStamp == lastTimeStamp
select s;
var requestResult = todayLastStatus.FirstOrDefault();
return requestResult;
}
Если я раскомментировать строку // var tempList = todayStatus.toList();
, где TempList не используется, он работает: requestResult.Device установлен! Но плохая сторона todayStatus.toList запускает запрос, который приносит огромный объем данных.
Как получить DeviceStatus с его относительными объектами?
Примечание: база данных за это SQL Server 2012
Мне нужно вернуть только один элемент с todayLastStatus.FirstOrDefault(), слишком много todayStatus для выполнения todayStatus.toList(), и мне нужны все свойства obejcts. – abreneliere
Не проблема. Вместо вызова .toList(), вызовите .FirstOrDefault() на todayStatus. Я обновил запрос Select. Вы можете получить ограниченное количество столбцов, чтобы сохранить ваши потребности на месте. – RRM
Мне не нужен первый, мне нужен один с lastTimeStamp, поэтому я выполняю let lastTimeStamp = todayStatusForMax.Max (s1 => s1.TimeStamp) – abreneliere