LinqToEntities код для запроса, нуждающегося в одной сущности, возвращенной каждому корневому узлу?
Я думаю, что я запутался с этим. Моя база данных выглядит так:
Locations [root]
Inspections [level1]
InspectionItems [level2]
InspectionReadings [level3]
Areas [level1]
Inspections [level2]
InspectionItems [level3]
InspectionReadings [level4]
Каждая таблица связана Guid с предыдущей таблицей, а таблица Inspections имеет нулевой AreaID, так что она может быть прямым потомком Locations.
Что мне нужно
for each Location
{take all InspectionReadings entities
where location == location
sort date descending
return the top Entity details}
add the Location details and the InspectionReading details into a new table
return new table
результат должен быть сеткой данных со списком мест и их последней датой проверки. каждое место должно появиться только один раз.
Что мне удалось сделать (это в моем DomainService.cs)
public IQueryable<LocationStatusList> GetLocationStatus()
{
var status = (from a in ObjectContext.Locations
from b in ObjectContext.InspectionReadings
orderby b.DateTaken descending, a.Name
select new LocationStatusList()
{
ID = b.ID,
LocationName = a.Name,
LastInspectionDate = b.DateTaken ?? DateTime.MinValue, // the data is nullable so it needs a value to return in that case
StatusNumber = b.Status ?? -1 // the data is nullable so it needs a value to return in that case
});
return status;
}
который возвращает все сущности InspectionItems с их соответствующим местоположением, и хотя я пытался, я не могу найти способ сделать то, что мне нужно.
Я хотел бы сделать весь код для этого в классе DomainService, но на данный момент я могу думать только о том, чтобы дать каждому запросу имя местоположения в качестве параметра из модели представления, вернуть одну сущность, создать новый список и добавить каждый отдельный объект.
Конечно, все это можно сделать в запросе LINQ?
3 ответа
Окончательный вариант, если я правильно понял:
var status = (from a in ObjectContext.Locations
select new {Location = a, LastReading = a.Inspections.SelectMany(i=>i.InspectionReadings).OrderBy(r=>r.PostDate).FirstOrDefault()};
Хорошо, попробуйте это:
var result = from l in Locations
from i in l.Inspestions
from ii in i.InspestionItems
from ir in ii.InspectionReadings
group ir by l into g
select new {Location = g.Key, LastReading = g.OrderBy(r=>r.DateTaken).LastOrDefault() };
Последний или по умолчанию по той причине, что порядок сортировки по умолчанию возрастает, и вам нужно самое последнее (последнее).
Спасибо @Val, код, который у меня теперь есть:
public IQueryable<LocationStatusList> GetLocationStatus()
{
var status = (from a in ObjectContext.Locations
select new LocationStatusList
{
ID=a.ID,
Name=a.Name,
LastInspectionDate= (from b in ObjectContext.Inspections
from c in ObjectContext.InspectionReadings
where c.InspectionItemID==b.ID && b.LocationID==a.ID
orderby c.DateTaken descending
select c.DateTaken).FirstOrDefault()??DateTime.MinValue,
StatusNumber = (from b in ObjectContext.Inspections
from c in ObjectContext.InspectionReadings
where c.InspectionItemID==b.ID && b.LocationID==a.ID
orderby c.DateTaken descending
select c.Status).FirstOrDefault()??-1,
});
return status;
}
который дает именно то, что мне нужно. Спасибо!