我有一个用于搜索的通用基础仓库方法(为了清晰起见进行了修剪):
public class Repository<TRepository> : IRepository<TRepository>
where TRepository : class, IEntity, new()
{
public virtual IQueryable<TRepository> SearchFor(Expression<Func<TRepository, bool>> predicate, Expression<Func<TRepository, bool>> orderbylinq = null)
{
if (orderbylinq == null)
{
return DbSet.Where(predicate);
}
else
{
return DbSet.Where(predicate).OrderBy(orderbylinq);
}
}
}
我有一个派生的存储库类:
public class TimeDetailRepository : Repository<TimeDetail>
在我的服务层中,我有一个调用SearchFor方法的类:
private TimeDetailRepository _timeDetailRepository;
public ManageTimeDetailsAppServ()
: base(new TimeDetailRepository())
{
_timeDetailRepository = new TimeDetailRepository();
}
IQueryable<TimeDetail> timeDetails2 = _timeDetailRepository.SearchFor(
x => x.Id == 3214);
在这种情况下,timeDetails2已经完全加载(所有相关的实体都已加载)。
但是,我有另一个类(基础服务层类)进行相同的SearchFor调用,但它不会加载相关的实体:
IQueryable<TRepository> dbEntity = _repository.SearchFor(x => x.Id == result.Value);
我试图从两个调用中创建一个视图模型,利用相关实体的属性值。为什么在一种情况下它会加载它们,而在另一种情况下它不会呢?这是同一个实体TimeDetail,同一个基本存储库类吗?
下面是你在调试器中看到的图片。为什么有些相关实体已被加载(例如Facility和TimeDetailStatus),而其他实体则没有(如OrderHeader或Customer)。
更新
我查看了生成的查询语句,它们似乎相似,即它们没有连接到其他表...那么可能上下文已经包含一些来自某些相关实体的缓存行,这就是它们被包括的方式吗?
TRepository
重命名为TEntity
。TRepository
让它看起来像是一个仓储库的类型,而不是实体的类型。 - Joe Enos