仅加载单个关联实体

时间:2011-05-26 19:43:57

标签: asp.net entity-framework repository-pattern n-tier-architecture

我有一个存储库来管理ComplaintTypes上的操作,该操作有大量关联实体,所以我def。不想加载所有内容,因此我有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 result;
        }

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

        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();  
}

2 个答案:

答案 0 :(得分:1)

你可以实现类似的东西

RepositoryBase

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();  
}

在ComplaintTypeRepository ...

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

答案 1 :(得分:0)

将LazyLoadingEnabled设置为true,您不再需要直接显式加载ComplaintSubType;无论什么东西触及财产,EF都应该为你加载它。或者,您可以使用Include(“ComplaintSubType”)方法在ComplaintType的同时加载它;这将是最好的选择。

HTH。