#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…