2014-09-20 2 views
0

Как включить связанный объект, но только выбрать верхний 1?Linq, чтобы выбрать топ 1 связанного объекта

public EntityFramework.Member Get(string userName) 
    { 
     var query = from member in context.Members 
        .Include(member => member.Renewals) 
        where member.UserName == userName 
        select member; 
     return query.SingleOrDefault(); 
    } 
+0

Я предполагаю, что вы хотите условно включить эту функцию в EF, пока вы не можете продвигать здесь: https://entityframework.codeplex.com/workitem/47 –

+0

Возможный дубликат [Как использовать Entity Framework включить с условием?] (http://stackoverflow.com/questions/24380345/how-to-use-entity-framework-include-with-condition) –

ответ

2

Согласно MSDN:

«Обратите внимание, что в настоящее время невозможно отфильтровать связанные объекты загружаются Включать всегда будут приносить все связанные с сущностями.».

http://msdn.microsoft.com/en-us/data/jj574232

Существует также UserVoice элемент для этой функции:

http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015345-allow-filtering-for-include-extension-method

подход использовать анонимный объект работы, даже если это не так чист, как вы хотите, это будет:

public Member GetMember(string username) 
    { 
     var result = (from m in db.Members 
        where m.Username == username 
        select new 
        { 
         Member = m, 
         FirstRenewal = m.Renewals.FirstOrDefault() 
        }).AsEnumerable().Select(r => r.Member).FirstOrDefault(); 

     return result; 

    } 

Свойство FirstRenewal используется как раз то, что EF6 загрузила первое обновление в члены объект. В результате член, возвращаемый из метода GetMember(), содержит только первое обновление.

Этот код генерирует один запрос в БД, поэтому, возможно, он достаточно хорош для вас.

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