Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多表包含的实体框架清理方式_C#_.net_Entity Framework - Fatal编程技术网

C# 多表包含的实体框架清理方式

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

我有一个大模型,我正试图从数据库中获取,并使用.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")
等等

一定有更好的办法吗?我正在努力寻找更好的方法。然后,我还需要在每个表上应用一些条件,例如,需要检查表上删除的标志。我想知道是否使用另一种方法从数据库中获取它会更容易。

如果您编写.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的关系