C# 多表包含的实体框架清理方式
我有一个大模型,我正试图从数据库中获取,并使用.Include(string)扩展方法加载我需要的所有实体。它变得非常混乱,我现在有18行,它们的水平长度也很长,我必须把它们锁在一起 例如:C# 多表包含的实体框架清理方式,c#,.net,entity-framework,C#,.net,Entity Framework,我有一个大模型,我正试图从数据库中获取,并使用.Include(string)扩展方法加载我需要的所有实体。它变得非常混乱,我现在有18行,它们的水平长度也很长,我必须把它们锁在一起 例如: var myModel = repository.Queryable() .Include("Entity1") .Include("Entity1.Entity2") .Include("Entity1.Entity2.Entity3") .Include("Entity1.Entity2.Entity3
var myModel = repository.Queryable()
.Include("Entity1")
.Include("Entity1.Entity2")
.Include("Entity1.Entity2.Entity3")
.Include("Entity1.Entity2.Entity3.Entity4")
.Include("Entity1.Entity2.Entity3.Entity4.Entity5")
等等
一定有更好的办法吗?我正在努力寻找更好的方法。然后,我还需要在每个表上应用一些条件,例如,需要检查表上删除的标志。我想知道是否使用另一种方法从数据库中获取它会更容易。如果您编写.Include(“Entity1.Entity2.Entity3.Entity4.Entity5”),则所有相关的实体都会立即加载,而不仅仅是最后一个。这样你就可以写了
repository.Queryable().Include("Entity1.Entity2.Entity3.Entity4.Entity5");
您将加载Entity3和Entity5。查看更多详细信息,尤其是
请注意,当前无法筛选加载了哪些相关实体。包含将始终存在于所有相关实体中
我还认为更好的是扩展方法Include的类型安全变体。与字符串变量相比,它对属性重命名等更具鲁棒性
repository.Queryable().Include(x => x.Entity1.Entity2.Entity3.Entity4.Entity5);
下面是一个通用存储库示例,其中包含实体的导航属性:
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;
}
}
公共类存储库:IRepository,其中T:class,IEntity
{
...
公共虚拟T GetOne(表达式谓词=null,表达式[]includeProperties=null)
{
var set=SetWithIncludes(includeProperties);
返回谓词!=null?set.FirstOrDefault(谓词):set.FirstOrDefault();
}
受保护的IQueryable集合WithIncludes(IEnumerable includes)
{
IQueryable set=DbSet;
如果(包括!=null)
{
foreach(包含在包含中的var)
{
set=set.Include(包括);
}
}
返回集;
}
}
以及实际用途:
_entityRepository.GetOne(c => c.Id == id, new Expression<Func<Entity, object>>[] { c => c.SubEntityOrEntityCollection.SubSubEntityOrEntityCollection });
\u entityRepository.GetOne(c=>c.Id==Id,新表达式[]{c=>c.SubEntityOrEntityCollection.SubSubEntityOrEntityCollection});
为什么懒散加载对您不起作用?我将在api中返回全部数据,因此这将成为一个视图模型,明天我将对此进行测试。我想当我把它映射到一个模型时,我将不得不进行过滤。只有当它们是1:1的关系时,这种串在一起才会起作用,不是吗。问题是这里也有1:n的关系