2013-12-02 4 views
3

У меня есть запрос Linq, который запрашивает следующие таблицы: Задачи со ссылкой «один-ко-многим»: TaskLinks и TaskLinks имеют одностороннюю единственная ссылка на таблицу под названием Entities..Include() .Where() .Select() в Linq to Entities Query

Я пытаюсь выбрать задачу, загрузить загрузку (через .Include) TaskLinks и выбрать Entity, связанную с TaskLink. Но мне нужно отфильтровать задачу (по уровню доступа int) и TaskLinks, чтобы я не включал записи Inactive (bool).

Вот мой Linq запрос:

Tasks.Where(t => t.AccessLevel <= 5) 
    .Include(tl => tl.TaskLinks.Where(tl2=> tl2.IfInactive == false) 
    .Select(tls => tls.Entity)) 

Я запустить этот запрос в LINQPad, и я получаю следующую ошибку, которую я не понимаю:

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

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

Спасибо вам заранее!

Боб

+0

Если вам нужно просто 'Entity' вы можете' Join' таблицы и фильтр по '' AccessLevel' и IfInactive'. –

ответ

2

.Include(...) «предлагает» провайдер запросов к жадной нагрузке навигации собственности. В этом случае он не сделает этого b/c, ваши результаты не являются Task объектами, это Entity объектов.

В любом случае, вы не фильтруете свойство навигации коллекции в операторе include (что является причиной вашей ошибки).

Вы хотите следующее:

// start with Tasks, filter by AccessLevel 
Tasks.Where(t => t.AccessLevel <= 5) 
    // get the TaskLinks for each Task 
    .SelectMany(t => t.TaskLinks) 
    // filter TaskLinks by IfInactive == false 
    .Where(tl => !tl.IfInactive) 
    // update to keep the hierarchy you want 
    .GroupBy(tl => tl.Task) 
    .Select(g => new 
     { 
      Task = g.Key, 
      FilteredTaskLists = g.Select(tl => new 
       { 
        TaskList = tl, 
        Entity = tl.Entity 
       }) 
     }); 
+0

Я запустил это в LinqPad, и то, что я получаю, это список Entities, с навигационными свойствами для TaskLinks и свойство навигации для задачи. Первоначальный запрос был просто обратным (что нам и нужно) - List of Tasks, с навигационным свойством для TaskLinks и навигационным свойством для Entity. Где я иду не так? –

+0

удалите 'Select' и добавьте вызов' .GroupBy (tl => tl.Task) ', который будет группировать отфильтрованные' TaskList '' Task'. Затем проецируйте результаты, которые вы хотите загрузить. Попробуйте обновленный запрос в моем решении. – Moho

+0

Спасибо. Я думаю, что мы почти там! Единственное, чего мне не хватает, это полная задача (все, что я получаю сейчас, - это свойство навигации для задачи) –

Смежные вопросы