Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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/6/entity-framework/4.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# 是否可以使用EF6将导航属性的Includes嵌套在Web API中?_C#_Entity Framework_Asp.net Web Api_Repository Pattern_Unit Of Work - Fatal编程技术网

C# 是否可以使用EF6将导航属性的Includes嵌套在Web API中?

C# 是否可以使用EF6将导航属性的Includes嵌套在Web API中?,c#,entity-framework,asp.net-web-api,repository-pattern,unit-of-work,C#,Entity Framework,Asp.net Web Api,Repository Pattern,Unit Of Work,从使用带有EF6的通用存储库/uow模式的webapi服务中,我需要返回嵌套的导航属性。模型A有一个模型B,模型B有一个模型C,依此类推。大概是这样的: public class A { public int SomeID { get; set; } public ICollection<B> Bs { get; set; } } public class B { public int SomeID {

从使用带有
EF6
的通用存储库/uow模式的
webapi
服务中,我需要返回嵌套的导航属性。模型A有一个模型B,模型B有一个模型C,依此类推。大概是这样的:

public class A
    {
        public int SomeID { get; set; }
        public ICollection<B> Bs { get; set; }
    }    
public class B
    {
        public int SomeID { get; set; }
        public ICollection<C> Cs { get; set; }
    }
公共A类
{
公共int SomeID{get;set;}
公共ICollection Bs{get;set;}
}    
公共B级
{
公共int SomeID{get;set;}
公共ICollection Cs{get;set;}
}
我可以得到A中的B,但是B中的C是空的。我就是这样做的:

// GENERIC REPOSITORY
public IQueryable<TEntity> Get(params Expression<Func<TEntity, object>>[] includes)
        {
            IQueryable<TEntity> query = _dbSet;
            if (includes != null)
            {
                foreach (var include in includes)
                    query = query.Include(include);
            }
            return query;
        }
//  FROM THE "A" CONTROLLER
public HttpResponseMessage Get()
        {
            HttpResponseMessage response;
            var results = _unitOfWork.A_Repository.Get(s => s.Bs);
            if (results == null)
            {
                response = new HttpResponseMessage(HttpStatusCode.NotFound);
            }
            else
            {
                response = Request.CreateResponse(HttpStatusCode.OK, results);
            }
            return response;
        }
//通用存储库
公共IQueryable Get(参数表达式[]包含)
{
IQueryable查询=_dbSet;
如果(包括!=null)
{
foreach(包含在包含中的var)
query=query.Include(包含);
}
返回查询;
}
//从“A”控制器
公共HttpResponseMessage Get()
{
HttpResponseMessage响应;
var results=\u unitOfWork.A\u Repository.Get(s=>s.Bs);
如果(结果==null)
{
响应=新的HttpResponseMessage(HttpStatusCode.NotFound);
}
其他的
{
response=Request.CreateResponse(HttpStatusCode.OK,results);
}
返回响应;
}
我不知道如何从A控制器传递额外的lambda来加载B中的Cs。我可以看到如何在不使用通用存储库的情况下做到这一点。我也愿意使用OData,但不知道如何在WebAPI中使用这种模式

我还尝试使用DbContext方法,但失败了:

public class MyContext : DbContext
    {
        public DbSet<A> As { get; set; }
        public DbSet<B> Bs { get; set; }
        public DbSet<C> Cs { get; set; }

        public MyContext()
            : base("MyDBContext")
        {
        }    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<B>().HasRequired(i => i.C);
            Bs.Include(i => i.C);
        }
    }
公共类MyContext:DbContext
{
公共数据库集为{get;set;}
公共数据库集Bs{get;set;}
公共数据库集Cs{get;set;}
公共MyContext()
:base(“MyDBContext”)
{
}    
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasRequired(i=>i.C);
包括(i=>i.C.);
}
}

您可以使用单个
Include
调用来完成此操作

_context.A_Repository // where to get from
    .Include(a => a.Bs.Select(b => b.Cs.Ds.Es)) // what to include
    .Where(a => a.IsCool == true) // how to filter
    .ToList(); // materialize result

.

这很有效。在我的示例中,它需要从工作单元(unitOfWork)而不是上下文进行编码。谢谢