C# 在asp.net中将第二个表添加到web api

C# 在asp.net中将第二个表添加到web api,c#,asp.net,sql-server,asp.net-web-api2,C#,Asp.net,Sql Server,Asp.net Web Api2,我在AP.NET2013上使用实体框架创建了一个简单的WebAPI项目。它执行基本CRUD。该项目连接到一个SQL Server数据库,其中包含两个表-学生和科目。这两个表与卷号相连,卷号在学生中为PK,在受试者中为FK 当我只接触学生时,项目运行良好。当我添加代码来处理主题时,它也会给我一个NotSupportedException 我正在Fiddler中运行此应用程序 我的代码如下: private StudentDBEntities db = new StudentDBEntities()

我在AP.NET2013上使用实体框架创建了一个简单的WebAPI项目。它执行基本CRUD。该项目连接到一个SQL Server数据库,其中包含两个表-学生和科目。这两个表与卷号相连,卷号在学生中为PK,在受试者中为FK

当我只接触学生时,项目运行良好。当我添加代码来处理主题时,它也会给我一个
NotSupportedException

我正在Fiddler中运行此应用程序

我的代码如下:

private StudentDBEntities db = new StudentDBEntities();

// GET: api/Student
public IList<SubjectDetailsDto> GetStudents()
{
    return db.Students.Select(s => new SubjectDetailsDto
    {
        Roll_Number = s.Roll_Number,
        FirstName = s.FirstName,
        LastName = s.LastName,
        Class = s.Class,
        Gender = s.Gender,
        subjects = s.subjects.ToList()
    }).ToList();
}
private StudentDBEntities db=new StudentDBEntities();
//获取:api/学生
公共图书馆(学生)
{
返回db.Students.Select(s=>newsubjectdetailsdto
{
卷号=s卷号,
FirstName=s.FirstName,
LastName=s.LastName,
Class=s.Class,
性别=s.性别,
subjects=s.subjects.ToList()
}).ToList();
}
有人能告诉我为什么会发生异常吗

编辑:SubjectDetailsDto.cs

public class SubjectDetailsDto
{
    public int Roll_Number { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Class { get; set; }
    public string Gender { get; set; }
    public List<Subject> subjects { get; set; }
}
公共类SubjectDetailsTo
{
公共整数卷号{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共int类{get;set;}
公共字符串{get;set;}
公共列表主题{get;set;}
}
我添加了异常的快照:

编辑

学生会

    public partial class Student
    {
      public int Roll_Number { get; set; }
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public int Class { get; set; }
      public string Gender { get; set; }

      public ICollection<Subject> subjects { get; set; }
   }
公立部分班学生
{
公共整数卷号{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共int类{get;set;}
公共字符串{get;set;}
公共ICollection主题{get;set;}
}
科目C

public partial class Subject
{
    public int Roll_Number { get; set; }
    public int English { get; set; }
    public int Mathematics { get; set; }
    public int Science { get; set; }
    public Nullable<int> Total { get; set; }

    //navigation property
    public Student student { get; set; }
}
公共部分类科目
{
公共整数卷号{get;set;}
公共int英语{get;set;}
公共整数数学{get;set;}
公共int科学{get;set;}
公共可为空的总计{get;set;}
//导航属性
公立学生学生{get;set;}
}

问题的根源在于实体框架不知道如何将
Enumerable.ToList()
转换为将加载数据的SQL代码。 罪魁祸首是:

subjects = s.subjects.ToList()
为了避免这种情况,您可以在两个单独的请求中加入表或加载数据:

var students = db.Students.Select(s => {}).ToList();
var studentIds = students.Select(s=>s.Id).ToArray();
var subjects = db.Subjects.Where(s=>studentIds.Contains(s.StudentId))
    .ToArray()
    .GroupBy(s=>s.StudentId)
    .ToDictionary(g=>g.Key, g=>g.ToList());
//Populate subjects for each student
students.ForEach(s=>
{
    s.subjects = subjects.ContainsKey(s.Id)?subjects[s.Id]:new List<Subject>();
});
var students=db.students.Select(s=>{}.ToList();
var studentIds=students.Select(s=>s.Id).ToArray();
var subjects=db.subjects.Where(s=>StudentId.Contains(s.StudentId))
.ToArray()
.GroupBy(s=>s.StudentId)
.ToDictionary(g=>g.Key,g=>g.ToList());
//为每个学生填充科目
学生。ForEach(s=>
{
s、 subjects=subjects.ContainsKey(s.Id)?subjects[s.Id]:新列表();
});

此行是否生成错误?subjects=s.subjects.ToList()整个return语句似乎有问题a但首先确定return语句的行cam请发布用于存储值的类文件i没有为数据库设置种子。它不是localDB。我用数据连接到一个外部SQL server。@PallaviPrasad,你能在它抛出的地方贴一行吗?我用了你的代码。错误出现在第一行
var students=db.students.Select(s=>newsubjectdetailsdto{}.Tolist()