Загрузить только один связанный объект

#asp.net #entity-framework #repository-pattern #n-tier-architecture

#asp.net #entity-framework #репозиторий-шаблон #n-уровневая архитектура

Вопрос:

У меня есть репозиторий для управления операциями над ComplaintTypes , в котором имеется большое количество связанных объектов, поэтому я определяю. не хочу загружать все, поэтому у меня есть LazyLoadingEnabled = true; . Однако я хочу загрузить один связанный объект, например: ComplaintSubType

У меня это работает, но я думаю, что есть способ получше? Спасибо!

 namespace Complaint.Dal.Repositories
{
    public class ComplaintTypeRepository : RepositoryBase<ComplaintType>, IComplaintTypeRepository
    {
        #region ctor

        /// <summary>
        /// ctor
        /// </summary>
        /// <param name="objectContext"></param>
        public ComplaintTypeRepository(IObjectContext objectContext)
            : base(objectContext)
        {
            //Lazy Load so we don't get bloated data
            objectContext.LazyLoadingEnabled = true;
        }

        #endregion

        #region Implementation of IComplaintRepository

        public IEnumerable<ComplaintType> GetAllComplaintTypes()
        {
            //Load the related SubTypes
            var result = GetAll(t => t.PK_Type_Id);
            foreach (var complaintType in result)
            {
                complaintType.ComplaintSubType.Load();
            }
            return resu<
        }

        public ComplaintType GetComplaintType(int typeId)
        {
            var result = GetSingle(t => t.PK_Type_Id == typeId);
            result.ComplaintSubType.Load();
            return resu<
        }

        public void UpdateComplaintType(ComplaintType entity)
        {
            Attach(entity);
        }

        #endregion
    }
}
  

Обновлено:

 public IEnumerable<T> GetAll<TKey, TType>(Expression<Func<T, TKey>> orderBy)  
{  
    var ret = ObjectSet;  
    //set Orderby  
    ret.OrderBy(orderBy);  
    return ret.ToList();  
}
  

Ответ №1:

Вы могли бы реализовать что-то вроде этого

База репозиториев

 public virtual IQueryable<TEntity> BuildQuery(IQueryable<TEntity> query)
{
    return query;
}

public IQueryable<TEntity> GetQuery()
{
    return BuildQuery(_objectSet);
}

public IEnumerable<T> GetAll<TKey, TType>(Expression<Func<T, TKey>> orderBy)  
{  
    var ret = GetQuery();  
    //set Orderby  
    ret.OrderBy(orderBy);  
    return ret.ToList();  
}
  

В хранилище жалоб…

 public override IQueryable<TEntity> BuildQuery(IQueryable<TEntity> query)
{
    return query.Include("ComplaintSubType");
}
  

Ответ №2:

Если для параметра LazyLoadingEnabled установлено значение true, вам больше не нужно явно загружать ComplaintSubType напрямую; всякий раз, когда что-то касается свойства, EF должен загрузить его для вас. В качестве альтернативы, вы могли бы использовать метод Include («ComplaintSubType»), чтобы загрузить его одновременно с ComplaintType; это было бы лучшим вариантом здесь.

HTH.

Комментарии:

1. Извините, забыл упомянуть, что я использую n-уровневую арку. Таким образом, объект не присоединен.

2. Хорошо, тогда для того, чтобы полностью понять, что вам сказать, мне нужно было бы еще немного ознакомиться с вашей базовой архитектурой, методами GetAll и GetSingle…