Расширенная справка по LINQ Query - PullRequest
1 голос
/ 13 февраля 2011

Итак, у меня есть следующий запрос LINQ:

var qryVans = from v in objContext.vans

                join s in objContext.schools on v.schoolID equals s.schoolID
                join l in objContext.locations on v.lastKnownLocationID equals l.locationID

                select new DisplayVan {
                    vanID = v.vanID,
                    vanName = v.vanName,
                    phone = v.phone,
                    capacity = (int)v.capacity,
                    schoolName = s.schoolName,
                    lastLocationName = l.locationName,
                    statusNote = v.statusNote,
                    isOffline = (v.isOffline == 1) ? true : false,
                    isPrayerRoom = (v.isPrayerRoom == 1) ? true : false,
                    isNotReady = (v.isNotReady == 1) ? true : false,
                    creationDate = v.creationDate,
                    modifiedDate = v.modifiedDate,
                    vanAssignments = from a in v.vanAssignments
                                    where a.vanID == v.vanID
                                    select a
                };

Все работает нормально, за исключением того, что мне нужно заполнить навигационные свойства объекта VanAssignment.Обратите внимание, что в моей проекции DisplayVan я использую вложенный запрос для сбора назначений фургонов для данного фургона.У сущности vanAssignment есть личность.Так как мне загрузить свойство vanAssignment.person в этом запросе?

Кроме того, могу ли я написать это, чтобы сделать его более эффективным?

Спасибо за вашу помощь!

EDIT

Вот где мой код выше терпит неудачу:

После того, как я выполню toList () в запросе выше, я попытаюсь получить доступ к нужному человеку, как это:

List<DisplayVan> lstVans = qryVans.toList<DisplayVan>();
foreach(DisplayVan objVan in lstVans) {

   Console.WriteLine(objVan.person.firstName);

}

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

Мой вопрос центрируется вокругзагрузить в это лицо сущность вместе с vanAssignment?

Надеюсь, это поможет.

Ответы [ 3 ]

1 голос
/ 13 февраля 2011

Я не Linq to sql expert, но нашел это:

DataLoadOptions dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<Assignment>(a => a.Person);
objContext.LoadOptions = dataLoadOptions;

Установка DataLoadOptions приведет к тому, что Person с нетерпением загрузит Назначение.

EDIT

Это работает в EF наверняка, но также должно работать в Linq to SQL:

(from a in v.vanAssignments
where a.vanID == v.vanID
select new { Assignment = a, Person = a.Person }).Select(i => i.Assignment);
1 голос
/ 14 февраля 2011

Поскольку DisplayVan звучит как DTO, почему бы вам не выбрать объект DisplayVanAssignment, который явно ссылается на нужные вам свойства человека.

0 голосов
/ 13 февраля 2011

Вы можете иметь что-то подобное для назначения человека

...
 modifiedDate = v.modifiedDate,
 vanAssignments = GetVanAssignmentsWithPerson(v.vanAssignments.where(a => a.VanID == v.vanID), person)
...

private static IEnumerable<Assignment> GetVanAssignmentsWithPerson(IEnumerable<Assignment> assignments, Person p)
{
      foreach(var assignment in assignments)
      {
           assignment.person = p;
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...