2015-09-27 7 views
0

Я работаю с базой данных сначала C# MVC, EF6, LINQ и JSon, чтобы попытаться передать данные как для Highcharts, так и для Google Maps для некоторых моих отчетов.Включить вложенные данные сущности, но не группировать их тогда при группировке по другим полям

Если бы я мог добавить изображение я бы показать вам соответствующую часть моей модели, но, к сожалению, мне нужно больше репутации, чтобы сделать это ...

та часть Entity Model я сосредоточен на прямо сейчас основан на центральном Docket, который содержит BuildingCode как часть отношения «один ко многим» к зданию с адресом и дальнейшим отношением к многоугольникам зданий (для сопоставления). Dockets также классифицируются одним или несколькими DocketTypes, и, таким образом, между Dockets и DocketTypes существует взаимосвязь «многие-ко-многим», которая напрямую не подвергается воздействию EF.

В качестве примера Docket, который представляет собой расследование, может быть связано с кражей мобильного телефона в здании A, расположенном на Campus X, не только украден мобильный телефон, но и нападавший также напал на жертву, чтобы украсть мобильный телефон. Итак, здесь есть 2 DocketTypes 1. Кража мобильного телефона и 2. нападение. Примечание: это фиктивно и только для иллюстрации.

Один из моих основных отчетов требует, чтобы я подсчитал, сколько типов docketTypes влияет на каждое здание и каждый кампус за определенный период. Когда я показываю это, мне также нужно показать, что такое DocketTypes.

У меня нет конца кошмара, пытаясь найти способ получить это право, я постоянно сталкиваюсь с круговыми опорными ошибками и нуждаюсь в использовании явных преобразований при попытке моделирования данных с помощью LINQ, чтобы я мог передать один вложенный объект через JSON на стороне клиента, где будет отображаться отображение.

В приведенном ниже коде мне сказали мне нужно Явное преобразование: Cannot implicitly convert type 'Campus_Investigator.ViewModels.DocketTypeViewModel' to 'System.Collections.Generic.IEnumerable<Campus_Investigator.ViewModels.DocketTypeViewModel>'. An explicit conversion exists (are you missing a cast?)

var currentDocketQuery = from d in db.Dockets 
       from dt in d.DocketTypes 
       from bp in d.BuildingDetail.BuildingPolygons 
       where d.OccurrenceStartDate >= datetime && d.BuildingDetail.CampusName == Campus 

       select new CampusBuildingDocketTypeViewModel() 
       { 
        BuildingCode = d.BuildingDetail.BuildingCode, 
        BuildingName = d.BuildingDetail.BuildingName, 
        //BuildingPolygons = d.BuildingDetail.BuildingPolygons, 
        DocketTypes = new DocketTypeViewModel() 
        { 
         Category = dt.Category, 
         SubCategory = dt.SubCategory, 
         ShortDescription = dt.ShortDescription 
        } 
       }; 

Я ценю любые идеи о том, как я могу явно преобразовать это или что лучший метод, который я могу использовать и избежать circular reference error ?

+0

сообщение об ошибке ясно: вы хотите установить DocketTypes в возвращаемое значение в DocketTypeViewModel, однако это SET of DocketTypeViewModels. – DevilSuichiro

+0

В классе 'CampusBuildingDocketTypeViewModel' DocketTypes определяется следующим образом:' public IEnumerable DocketTypes {get; задавать; } 'Так что не DocketTypes, а затем SET? – Giles

ответ

1

Вы включили в свой запрос некоторую избыточную часть (которая выполняет некоторое внутреннее соединение). from bp in d.BuildingDetail.BuildingPolygons соединен, но затем не показан в результате. Так что это совершенно не имеет смысла. Из-за этого в результате могут быть дублированы элементы. from dt in d.DocketTypes неправильно присоединился, хотя вам это нужно в результат, а потому, что DocketTypes выводится в д в db.Dockets, так что это просто сомнение, как это:

var currentDocketQuery = from d in db.Dockets 
         where d.OccurrenceStartDate >= datetime && d.BuildingDetail.CampusName == Campus 
         select new CampusBuildingDocketTypeViewModel() 
         { 
          BuildingCode = d.BuildingDetail.BuildingCode, 
          BuildingName = d.BuildingDetail.BuildingName, 
          //BuildingPolygons = d.BuildingDetail.BuildingPolygons, 
          DocketTypes = d.DocketTypes 
         }; 

На самом деле я могу см. прокомментированную строку //BuildingPolygons = d.BuildingDetail.BuildingPolygons, поэтому, если вы хотите включить ее, она также должна работать.

Если DocketTypes имеет другой тип d.DocketTypes, то вам нужна простая проекция так:

var currentDocketQuery = from d in db.Dockets 
         where d.OccurrenceStartDate >= datetime && d.BuildingDetail.CampusName == Campus 
         select new CampusBuildingDocketTypeViewModel() 
         { 
          BuildingCode = d.BuildingDetail.BuildingCode, 
          BuildingName = d.BuildingDetail.BuildingName, 
          //BuildingPolygons = d.BuildingDetail.BuildingPolygons, 
          DocketTypes = d.DocketTypes.Select(e => new DocketTypeViewModel() 
                  { 
                   Category = e.Category, 
                   SubCategory = e.SubCategory, 
                   ShortDescription = e.ShortDescription 
                  }) 
         }; 
0

мне удалось решить эту одну, используя ниже. Основная проблема с этим - это циркулярная ссылка, существующая в модели. Когда JSON сериализует их, все разваливается, поэтому требуется много преобразований, чтобы убедиться, что я извлекаю только то, что мне нужно. В этом случае сгруппированы кампус и данные здания (ниже перечислены полигоны, в которых только половина комментариев из выше), а затем включают в себя детали DocketTypes, которые произошли в каждом здании.

var datetime = DateTime.Now.AddDays(-30); 

var campusDocket = from d in db.Dockets 
       where d.OccurrenceStartDate >= datetime && d.BuildingDetail.CampusName == Campus 
       group d by new { d.BuildingDetail.CampusName, d.BuildingDetail.BuildingCode, d.BuildingDetail.BuildingName } into groupdata 
       select new CampusBuildingDocketTypeViewModel 
       { 
        BuildingCode = groupdata.Key.BuildingCode, 
        BuildingName = groupdata.Key.BuildingName, 
        CampusName = groupdata.Key.CampusName, 
        Count = groupdata.Count(), 
        BuildingPolygons = from bp in db.BuildingPolygons 
             where bp.BuildingCode == groupdata.Key.BuildingCode 
             select new BuildingPolygonViewModel 
             { 
              Accuracy = bp.Accuracy, 
              BuildingCode = bp.BuildingCode, 
              PolygonOrder = bp.PolygonOrder, 
              Latitude = bp.Latitude, 
              Longitude = bp.Longitude 
             }, 
        DocketTypes = from doc in db.Dockets 
           from dt in doc.DocketTypes 
           where doc.OccurrenceStartDate >= datetime && doc.BuildingCode == groupdata.Key.BuildingCode 
           select new DocketTypeViewModel 
           { 
            Category = dt.Category, 
            SubCategory = dt.SubCategory, 
            ShortDescription = dt.ShortDescription 
           } 
       }; 

Ответ снова является ViewModels. Я считаю, что ViewModels, похоже, решает много проблем ...