Entity Framework 4.1 Code First - Включить игнорируется при использовании LinqKit PredicateBuilder - PullRequest
4 голосов
/ 21 июня 2011

Я использую Entity Framework 4.1 Code First, а также использую PredicateBuilder, чтобы я мог строить выражения предикатов для нескольких классов Спецификации (используя шаблон Спецификации). Я могу правильно построить предикат и применить его к DbSet, и данные, которые я получаю, - это то, что я ожидаю. Однако, что бы я ни пытался, загрузка всегда ленивая. Это простой пример того, как я создаю предикат и применяю его.

IQueryable<HairColor> hairColorQuery = Context.Set<HairColor>().AsExpandable();

Expression<Func<Parent, bool>> parentPredicate = PredicateBuilder.And(PredicateBuilder.True<Parent>(), p => p.NameLast.StartsWith("V")).Expand();

Expression<Func<HairColor, bool>> hairColorPredicate = PredicateBuilder.And(PredicateBuilder.True<HairColor>(), h => h.Parents.AsQueryable().Any(parentPredicate));

HairColor[] hairColors = hairColorQuery.Where(hairColorPredicate).Include(h => h.Parents).ToArray();

Как я уже говорил выше, я получаю данные, которые мне нужны, но игнорирует Включить.

У кого-нибудь есть идеи?

Ответы [ 2 ]

11 голосов
/ 07 июня 2012

Поздравляю с этим в конце, но у меня возникла та же проблема с использованием расширенного метода Include при использовании построителя предикатов LinqKits. Проблема, о которой говорилось в предыдущем ответе, состоит в том, что приведение LinqKits ExpandableQuery к ObjectQuery (как требуется расширением Include) приводит к нулю.

Однако нашел эту ссылку http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/, которая является построителем Predicate, который не использует AsExpandable для выполнения поиска и, следовательно, для него можно использовать метод Include. Хотя приведенное выше решение также сработало для меня, этот другой построитель предикатов позволил мне поддерживать мой код в чистоте / более согласованным

2 голосов
/ 21 июня 2011

Вероятно, изменяет форму запроса .Попробуйте этот обходной путь

HairColor[] hairColors = hairColorQuery.Where(hairColorPredicate)
                                       .Select(hc => new 
                                                     {
                                                         HairColor = hc,
                                                         Parents = hc.Parents // eager load
                                                     })
                                       .AsEnumerable()
                                       .Select(hc => hc.HairColor);
...