EF - Почему не включает работу на свойства - PullRequest
4 голосов
/ 12 сентября 2011

Итак, у меня есть классы, которые выглядят так:

public class User {
    public virtual IList<Member> Members {get;set;}
}

public class Member {
    public virtual AnotherTable Another {get;set;}
}

public class AnotherTable {
    public string Name {get;set;}
}

Когда я выполняю запрос непосредственно к DataContext, включается включение, но когда я выполняю AsQueryable () для IList членов, включение не работает.

Есть ли способ использовать функциональность Include / Eager для отложенных загруженных свойств, таких как свойство Members выше, или мне всегда нужно пройти через DataContext, чтобы получить эту функцию?

User.Members.AsQueryable().Include(a => a.Another).ToList() // <-- nada, no way Jose
_db.Members.Include(m => m.Another).ToList() // <-- all good in the neighborhood

Я спрашиваю, потому что это может быть огромная разница в 1 sql запросе против 100 запросов на что-то эквивалентное.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

AsQueryable не делает запрос linq-to-entity. Это по-прежнему запрос Linq-to-object поверх List. List не знает, как обращаться с Include - только DbQuery знает это, поэтому вы должны получить DbQuery:

var entry = context.Entry(user);
entry.Collection(u => u.Member).Query().Include(m => m.Another).Load();
0 голосов
/ 07 марта 2013

Я также столкнулся с той же проблемой.

Я решил эту проблему, просто добавив ссылку System.Data.Entity и использовав следующее пространство имен:

   using System.Data.Entity;

Вы можете попробовать с ним.

0 голосов
/ 12 сентября 2011

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

    private IQueryable<T> GetQuery<T>(params Expression<Func<T, object>>[] includeProperties) where T : class
    {
        IQueryable<T> query = _db.Set<T>();

        if (includeProperties != null)
        {
            foreach (Expression<Func<T, object>> expression in includeProperties)
            {
                query = query.Include(expression);
            }
        }

        return query;
    }
...