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;
}

который дает именно то, что мне нужно. Спасибо!

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