ASP.NET linq选择多个连接

时间:2015-11-17 22:56:32

标签: asp.net entity-framework-4

我首先从EF代码中获取此数据库,现在我很难获取数据。

我有以下实体

计划:是一个包含锻炼的锻炼计划。

锻炼:是一个包含集合列表的日常规。

设置:是y加载重复x次练习。

锻炼:是一项包含区域的健身运动。

区域:是人体上的一个区域,包含肌肉。

肌肉:是人体的肌肉。

模型示例

以下是3个模型示例

    public class Workout
{
    [Key]
    public int WorkoutId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Set> Sets { get; set; }
}
 public class Set
{
    [Key]
    public int SetId { get; set; }
    //Foreign key for Exercise
    public int ExerciseId { get; set; }
    [ForeignKey("ExerciseId")]
    public Exercise Exercise { get; set; }
    public decimal Load { get; set; }
    public decimal Order { get; set; }
}

    public class Exercise
{
    [Key]
    public int ExerciseId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    //Foreign key for Region
    public int RegionId { get; set; }
    public Region Region { get; set; }
}

和脚手架控制器

// GET: api/Workouts
    public IQueryable<Workout> GetWorkouts()
    {          
        return db.Workouts;
    }

因此,只给我一个带有iCollection Sets的Workout对象为null。

// GET: api/Workouts
    public IQueryable<Workout> GetWorkouts()
    {          
        return db.Workouts.Include(w => w.Sets);
    }

通过包含集合,我可以获得相应的集合。

但是如果我想得到一个锻炼,包括套装,那些套装会包含练习,那些练习会包括最终有肌肉列表的区域?

如果我想从id锻炼,如下:

        [ResponseType(typeof(Workout))]
    public IHttpActionResult GetWorkout(int id)
    {
        Workout workout = db.Workouts.Find(id);
        if (workout == null)
        {
            return NotFound();
        }

        return Ok(workout);
    }

我将如何包含

修改 从Visual Studio模板/帮助页面,我可以看到以下内容:

GET api/Workouts/{id}

应提供med:

{
   "workoutId": 1,
   "name": "sample string 2",
   "description": "sample string 3",
   "sets": [
   {
     "setId": 1,
     "exercise": {
     "exerciseId": 1,
     "name": "sample string 2",
     "description": "sample string 3",
     "regionId": 4,
     "region": {
     "regionId": 1,
     "regionName": "sample string 2",
     "muscles": [
        {
          "muscleId": 1,
          "latinName": "sample string 2",
          "dkName": "sample string 3",
          "enName": "sample string 4",
          "description": "sample string 5"
        },
        {
          "muscleId": 1,
          "latinName": "sample string 2",
          "dkName": "sample string 3",
          "enName": "sample string 4",
          "description": "sample string 5"
        }
      ]
    }
  },

但它不会发生,我会打开任何让我在JSON中返回完整程序的东西。 skype,teamwievr,堆栈,另一种解决方案,无论如何。

2 个答案:

答案 0 :(得分:3)

最后我明白了:

 public class Exercise
 {
     [Key]
     public int ExerciseId { get; set; }
     public string Name { get; set; }
     public string Description { get; set; }
     //Foreign key for Region
     //public int RegionId { get; set; }
     public virtual Region Region { get; set; }    //had to be virtual -.-
 }

答案 1 :(得分:2)

如果您正确设置了模型,那么链接Include()方法应该可行。

public IQueryable<Workout> GetWorkouts()
{          
    return db.Workouts.Include(w => w.Sets.AsQueryable().Include(s => s.Excercises.AsQueryable().Include(e => e.Regions.AsQueryable().Include(r => r.Muscles))));
}