Несколько включает использование Entity Framework и Repository Pattern

Я использую Entity Framework и шаблон репозитория для всего доступа к данным, при использовании навигации по таблицам я заметил, что выполняются 2 запроса, когда я получаю первый объект и ссылаюсь на поле в объекте навигации. Поскольку у меня много взаимосвязей в базе данных, использование этого метода для моих свойств навигации может вызвать накладные расходы на производительность.

Я изучил метод Include(string tableName), и он будет работать очень хорошо (если бы я не использовал общий RP), но для этого требуется только одно имя таблицы. Мне удалось воспроизвести это в моем шаблоне репозитория для одного включения, изменив my where с classs на EntityObject, но как я могу иметь несколько включений в одном запросе, используя шаблон репозитория?

вот мой код:

public class GenericRepository<T> : IRepository<T> where T : EntityObject, new()
{
    private Entities _Context;
    private ObjectSet<T> _ObjectSet;

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, string include)
    {
        // This works OK
        return this._ObjectSet.Include(include).Where(predicate);
    }

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, param string[] include)
    {
        // This will not work but is what I am trying to do
        return this._ObjectSet.Include(include).Where(predicate);
    }
}

person Andy Clark    schedule 27.09.2012    source источник


Ответы (1)


Вы можете связать свои включения:

public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, param string[] include)
{
    IQueryable<T> query = this._ObjectSet;
    foreach(string inc in include)
    {
       query = query.Include(inc);
    }

    return query.Where(predicate);
}
person heavyd    schedule 27.09.2012
comment
Это не компиляция, query = query.Include(inc) IQueryable ‹T› не содержит метода с именем Include. - person Andy Clark; 28.09.2012
comment
Возможно, вам потребуется добавить using System.Data.Entity - person heavyd; 28.09.2012
comment
ObjectQuery<T> также имеет определенный метод, поэтому вы можете заменить им IQueryable<T>. Какую версию EF вы используете? - person heavyd; 28.09.2012
comment
Я только что понял, что его там нет, потому что я использую более старую версию Entity Framework и System.Data.Entity. Я обновил версии и теперь работает. - person Andy Clark; 28.09.2012
comment
Какая версия является старой версией и до какой версии вы обновились? - person Mukus; 18.11.2013