2013-04-03 2 views
1

Это мой общий ответ, который я использую, поскольку в заголовках указано, что я хочу знать, как фильтровать свойства навигации.Generic repository: как фильтровать загруженные навигационные свойства

public IEnumerable<T> Query(
     Expression<Func<T, bool>> filter = null, 
     Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, 
     string includeProperties = "") 
    { 
     IQueryable<T> query = _objectSet.Where(e => !e.IsDeleted);    

     if (filter != null) 
     { 
      query = query.Where(filter); 
     } 

     foreach (var includeProperty in includeProperties.Split 
      (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      query = query.Include(includeProperty); 
     } 

     if (orderBy != null) 
     { 
      return orderBy(query).ToList(); 
     } 
     else 
     { 
      return query.ToList(); 
     } 
    } 

Контроллер:

var viewModel = new StudentViewModel(); 
     viewModel.Students= _unitOfWork.Students.Query(
      includeProperties: "Subjects, Instructors"); 

Теперь моя проблема, я хочу, чтобы добавить .где (е => e.IsDeleted!) к [предметов], и [Инструкторов] с использованием репозитория.

Благодаря

EDIT: по Ладислава, в настоящее время не представляется возможным (также упоминается здесь в MSDN: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx)

Can i just use this instead? 
viewModel.Subjects = viewModel.Students.Where(i => i.StudentID ==Id.Value) 
        .Single().Subjects.Where(e => !e.IsDeleted); 

Моя единственная забота в том, что запрос может возвращать множество записей с IsDeleted == верно. Конечно, код, который я опубликовал как альтернативный, работает, я просто не хочу извлекать данные, которые мне не нужны, хотя я могу его фильтровать, используя приведенный выше код.

+0

Не могли бы вы объяснить, что вы имеете в виду «добавить a .Where (e =>! E.IsDeleted) в [Subjects] и [Instructors], используя репозиторий». – Alex

+0

@voo Я думаю, она хочет отфильтровать включенные свойства. – tschmit007

+0

@ samantha07 Не могли бы вы показать нам метод query.Include()? – Alex

ответ

2

LINQ to SQL поддерживает этот сценарий, используя LoadWith DataLoadOption , Пример в http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx показывает простой случай, который поддерживает EF с помощью инструкции Include.

Northwnd db = new Northwnd(@"c:\northwnd.mdf"); 
DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Customer>(c => c.Orders); 
db.LoadOptions = dlo; 

Однако, в отличие от EF, LINQ к SQL поддерживает следующие:

dlo.LoadWith<Customer>(c => c.Orders.Where(o => o.ShippedDate is Null); 

Если вы чувствуете, что это важный сценарий повышения для EF, рассмотреть вопрос голосования за него на http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015345-allow-filtering-for-include-extension-method.

На данный момент наилучшим вариантом является проецирование фильтра в предложении Select, но это становится сложным с общим хранилищем.

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