Динамические фильтры с Entity Framework 3.5 и энергичной загрузкой - PullRequest
1 голос
/ 17 августа 2011

У меня есть модель БД со следующими таблицами:

A * ---- 1 B 1 ---- * C

На основе этой схемы я создал модель данных сущностей, которая позволяет мне загружать все As в моей БД. Поскольку я также использую Bs в своих запросах Linq, я загружаю как:

using(MyEntities entities = new MyEntities()){
  var result = from a in entities.As.Include("B") where a.Code == 123 && a.B.Code == 321 select a;
}

Результаты могут быть дополнительно отфильтрованы пользователем, поэтому я создаю фильтры в зависимости от выбора пользователя, например:

int filterValue = 222; //FilterValue is passed in by the user
IList<Func<A, bool>> filters = new List<Func<A, bool>>();
filters.Add(x => x.B.C.Any(i => i.C.Code == filterValue));
...build more filters...

Позже я применяю фильтры, используя:

foreach (var filter in filters)
{
  results = results.Where(filter);
}

Обратите внимание, что в коде фильтра я использую ссылку C (которая является коллекцией Cs). Вот где EF терпит неудачу, потому что коллекция C пуста (не была загружена). Как я могу заставить EF охотно загружать все связанные свойства для графа объекта, чтобы я мог применить свои фильтры или есть лучший способ сделать это?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

Причина, по которой ваш C не загружен, заключается в том, что вы не включили его в свой запрос. Вы должны использовать:

entities.As.Include("B.C")

Но результат описан @Eranga - вы переносите все записи в ваше приложение и фильтруете их в памяти вашего приложения по linq-to-objects вместо того, чтобы выполнять фильтрацию по linq-to-entity и передавать только отфильтрованные записи.

0 голосов
/ 17 августа 2011

Вы используете IList<Func<A, bool>> в качестве фильтров.Это делает его запросом LINQ-to-Objects.Вот почему вы жалуетесь C коллекция пуста.

Поэтому вместо этого используйте IList<Expression<Func<A, bool>>> в качестве фильтров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...