C# 在c asp.net web api中使用2个外键从表中检索数据
我试图从一个有2个外键的表中检索数据,并使用where子句对其进行筛选。这是一个web api场景,当我调用该方法的url端点时,它返回http代码200,但没有数据,也不会返回错误。下面是我表格的基础模型C# 在c asp.net web api中使用2个外键从表中检索数据,c#,asp.net,entity-framework,linq,C#,Asp.net,Entity Framework,Linq,我试图从一个有2个外键的表中检索数据,并使用where子句对其进行筛选。这是一个web api场景,当我调用该方法的url端点时,它返回http代码200,但没有数据,也不会返回错误。下面是我表格的基础模型 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; u
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace xxxx.Models
{
public class Feedback
{
[Key]
public int Id { get; set; }
[Required]
public string comment { get; set; }
public string date { get; set; }
//Foreign key
[Required]
public int projectId { get; set; }
public int studentId { get; set; }
public int companyId { get; set; }
[ForeignKey("studentId")]
public Student student { get; set; }
[ForeignKey("companyId")]
public Company company { get; set; }
}
}
控制器中的代码具有我用于检索数据的方法,如下所示
[Route("GetComments")]
[HttpGet]
public IQueryable<CommentDTO> GetFeedbacks(int project_id)
{
var comments = from b in db.Feedbacks.Where(b => b.projectId == project_id)
.Include(b=> b.company)
.Include(b=> b.student)
select new CommentDTO
{
Id = b.Id,
comment = b.comment,
date = b.date,
student = new StudentCommentDTO()
{
student_number = b.student.Id,
first_name = b.student.firstName,
middle_name = b.student.middleName,
last_name = b.student.lastName,
profile_pic = b.student.profilePic
},
company = new CompanyCommentDTO()
{
companyID = b.company.Id,
profile_pic = b.company.profilePicture,
name = b.company.companyName
}
};
return comments;
}
请注意,StudentCommentDTO只是一个数据传输对象,我也尝试删除where子句,但仍然不起作用,我也尝试将导航属性设置为虚拟,但结果仍然相同。我可以大胆地确认表中有数据。下面的屏幕截图显示了我在fiddler中得到的结果,总是返回一个空数组
我想我已经看到了我的问题所在,存储我想要的数据的反馈表必须为Student和Company的外键,在每种情况下,其中一个必须为null,我已经使其可能为null。我正在尝试建立一种情况,在这种情况下,具有两种不同角色的人、公司和学生可以参与某个特定帖子的评论我假设您的学生Id是学生课堂上的Id。请记住,如果任何Id为null,则返回的列表中将缺少完整的连接记录。原因:不能在null上连接
在这种情况下,返回IQueryable至少是web上下文是很奇怪的。您应该返回IEnumerable并具有return comments.ToList;如果将返回类型从IQueryable更改为IEnumerable,您是否也会遇到同样的问题?使用IQueryable不是我的选择,我使用的是asp.net web api框架,IQueryable附带的方法是默认方法,我所做的只是自定义它以适应我的情况。我试过使用IEnumerable,问题仍然是相同的。在这种情况下,如果完成连接的一个键为null,那么整个记录将被排除。你的最后一段令人困惑。。。其中一个必须为空,或者其中一个为空?如果您可以用您的解决方案回答它。我相信你现在已经解决了。
IQueryable<CommentDTO> comments = null;
comments = from b in db.Feedbacks.Where(b => b.projectId == project_id)
join std in db.Students on b.studentId equals std.Id
join cmp in db.Companies on b.companyId equals cmp.Id
select new CommentDTO
{
Id = b.Id,
comment = b.comment,
date = b.date,
student = new StudentCommentDTO()
{
student_number = std.Id,
first_name = std.firstName,
middle_name = std.middleName,
last_name = std.lastName,
profile_pic = std.profilePic
},
company = new CompanyCommentDTO()
{
companyID = cmp.Id,
profile_pic = cmp.profilePicture,
name = cmp.companyName
}
};
return comments.ToList();