我有一个大型模型,我试图从数据库中获取并使用.Include(string)扩展方法来加载我需要的所有实体。它变得非常混乱,我现在有18行也是长的水平长度,我必须将它们链接在一起。
示例:
var myModel = repository.Queryable()
.Include("Entity1")
.Include("Entity1.Entity2")
.Include("Entity1.Entity2.Entity3")
.Include("Entity1.Entity2.Entity3.Entity4")
.Include("Entity1.Entity2.Entity3.Entity4.Entity5")
等等!
必须有更好的方法吗?我正在努力寻找更好的方法。然后我还需要在每个表上应用一些条件,例如需要检查表上的删除标志。我想知道使用其他方法从数据库中获取它是否更容易。
答案 0 :(得分:1)
如果你写.Include(" Entity1.Entity2.Entity3.Entity4.Entity5")所有相关实体都是急切加载的,而不仅仅是最后一个。所以你可以写
repository.Queryable().Include("Entity1.Entity2.Entity3.Entity4.Entity5");
您将加载Entity3以及Entity5。查看http://msdn.microsoft.com/en-gb/data/jj574232#eagerLevels了解详情,尤其是
请注意,目前无法过滤加载了哪些相关实体。包含将始终存在于所有相关实体中。
另外我认为更好的是扩展方法Include的类型安全变体。对于属性重命名等,它比字符串变体更健壮。
repository.Queryable().Include(x => x.Entity1.Entity2.Entity3.Entity4.Entity5);
答案 1 :(得分:0)
以下是通用存储库的示例,其中包含实体的导航属性选项:
public class Repository<T> : IRepository<T> where T : class, IEntity
{
...
public virtual T GetOne(Expression<Func<T, bool>> predicate = null, Expression<Func<T, object>>[] includeProperties = null)
{
var set = SetWithIncludes(includeProperties);
return predicate != null ? set.FirstOrDefault(predicate) : set.FirstOrDefault();
}
protected IQueryable<T> SetWithIncludes(IEnumerable<Expression<Func<T, object>>> includes)
{
IQueryable<T> set = DbSet;
if (includes != null)
{
foreach (var include in includes)
{
set = set.Include(include);
}
}
return set;
}
}
和实际用法:
_entityRepository.GetOne(c => c.Id == id, new Expression<Func<Entity, object>>[] { c => c.SubEntityOrEntityCollection.SubSubEntityOrEntityCollection });