2009-11-05 4 views
4

Эй, так что я получил ситуацию, когда я вытягивать клиент обратно из базы данных и включая все тематические исследования с ним путем включаемогоLinq включают с тем, где пунктом

return (from c in db.Clients.Include("CaseStudies") 
     where c.Id == clientId 
     select c).First(); 

, но то, что я хочу сделать сейчас, и где пункт о включенных casestudies так, что он возвращает только тематические исследования, где удаленные = ложные

вроде этого

return (from c in db.Clients.Include("CaseStudies") 
     where c.Id == clientId 
     && c.CaseStudy.Deleted == false 
     select c).First(); 

Но это не работает :(любые идеи

+0

Можете ли вы подробнее остановиться на «Безразлично «работа»? В каком смысле? Что ты видишь? –

+0

Что вы подразумеваете под "не работает"? Вызывает ли это исключение, просто ли оно не возвращает ожидаемые результаты? Удаляется логическое? –

ответ

7

Условные включения не поддерживаются из коробки в EF версии 1.0. Но Алекс Джеймс имеет немного Hacky обходной путь для этого хорошо объясняется здесь: http://blogs.msdn.com/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx

var dbquery = 
    from c in db.Clients 
    where c.Id == clientID 
    select new { 
     client = c, 
     caseStudies = from cs in c.CaseStudy 
       where cs.Deleted==false 
       select cs 
    }; 

return dbquery 
    .AsEnumerable() 
    .Select(c => c.client); 

Кроме того, мне не удалось сделать эту работу обходной путь со многими-ко-многим.

+0

Лучшим ответом является запрос на «CaseStudies», в том числе «Клиент», затем «Выбрать» клиент, slap '.Distinct(). ToList()' и voila! «Client.CaseStudies» будет автоматически заполнена с помощью свойств навигации. – JoeBrockhaus

+0

Правильно ли этот код? «Клиент» нигде не может быть честным. – Mittchel

+0

Я думаю, что также стоит упомянуть, что AsNoTracking не позволит EF совершать магию исправления отношений (например, 'from c in db.Clients.AsNoTracking()') – Vladimirs

1

Вы можете вернуть подобную группу записей таким образом, GroupBy будет делать перечисление разным, но это не сложно.

CaseStudies.Include("Client") 
      .Where(c => !c.Deleted && c.Client.ID == ClientID) 
      .GroupBy(c => c.Client.ID); 
+0

Это было бы моим предложением. 'GroupBy' будет работать, но вы также можете просто« выбрать »из« Клиента ». Итак, вы закончите с 'IEnumerable '. Кроме того, удалите '.Distinct()' на конец (EF знает, что делает клиент отдельным, поэтому вам не нужен специальный 'IEqualityComparer '). «Client.CaseStudies» будет заполняться каждым из-за свойств навигации. – JoeBrockhaus

0

Одним из вариантов является выполнение запроса на ваши результаты, как это:

var results = (from c in db.Clients.Include("CaseStudies") 
       where c.Id == clientId 
       select c).First(); 

results.CaseStudies = (from c in results.CaseStudies 
         where c.Deleted == false 
         select c).ToList(); 

Или, конечно, вы можете использовать лямбда-выражение:

var results = db.Clients 
       .Include(c => c.CaseStudies) 
       .Where(c => c.ID == clientId).First(); 

results.CaseStudies = results.CaseStudies.Where(c => !c.Deleted).ToList(); 
Смежные вопросы