2013-08-06 3 views
1

Код:Выпуск на обрамление запросов LINQ

IQueryable<Meet> query = _meetReadService.GetRecords() 
           .Include(x => x.MeetType) 
           .Where(x => x.EndDateTime <= DateTime.Now); 

Когда я добавляю следующую строку в приведенном выше запросе Linq, сообщение об ошибке генерируется, как

Выражение Включать путь должен относиться к свойства навигации, определенные для типа. Используйте пунктирные пути для ссылочных навигационных свойств и оператор Select для свойств навигации для коллекции.

x => x.MeetTeamMembers.Where(e => e.MeetType.IsManager) 
         .Select(z => z.User.Name) 
         .FirstOrDefault() 

Мой полный код:

IQueryable<Meet> query = _meetReadService.GetRecords() 
      .Include(x => x.MeetType) 
      .Include(x => x.MeetTeamMembers.Where(e => e.MeetType.IsManager) 
              .Select(z => z.User.Name) 
              .FirstOrDefault()) 
      .Where(x => x.EndDateTime <= DateTime.Now); 
+0

Entity Framework или LINQ к SQL? – xanatos

+0

Является ли MeetType сопоставленным с базой данных или это просто свойство? ORM не могут работать со свойствами, которые не сопоставляются с базой данных –

ответ

0

Вы не можете сделать фильтрацию при вызове Include. Это означает, что виновником является .Where(e => e.MeetType.IsManager). То, что вы хотите, может быть сделано только после запрос выполнил:

IQueryable<Meet> query = _meetReadService.GetRecords() 
             .Include(x => x.MeetType) 
             .Include(x => x.MeetTeamMembers) 
             .Select(z => z.User.Name).FirstOrDefault()) 
             .Where(x => x.EndDateTime <= DateTime.Now); 

var queryResults = query.ToList(); 

foreach (var meet in queryResults) 
{ 
    meet.MeetTeamMembers = meet.MeetTeamMembers.Where(e => e.MeetType.IsManager); 
}