我有三个由类表示的SQL表,我想让实体框架6加入这些表,这样我就可以获得Exam
, Test
和UserTest
表的所有细节,其中UserTest.UserID
是0
或X
。
我已经建立了一个责任库,这适用于简单的查询,但是我无法在问题底部的LINQ中加入UserTest
类。
下面是我的类:
public class Exam
{
public int ExamId { get; set; }
public int SubjectId { get; set; }
public string Name { get; set; }
public virtual ICollection<Test> Tests { get; set; }
}
public class Test
{
public int TestId { get; set; }
public int ExamId { get; set; }
public string Title { get; set; }
public virtual ICollection<UserTest> UserTests { get; set; }
}
public class UserTest
{
public int UserTestId { get; set; }
public string UserId { get; set; }
public int TestId { get; set; }
public int QuestionsCount { get; set; }
}
我想做的是有一个查询看起来像这样:
var exams = _examsRepository
.GetAll()
.Where(q => q.SubjectId == subjectId)
.Include(q => q.Tests )
.Include(q => q.Tests.UserTests) // Error on this line
.ToList();
但是它不允许我在VS2013中包含UserTests
。
更新:
这是我第一次尝试的查询:
var userTests = _userTestsRepository
.GetAll()
.Include(t => t.Test)
.Include(t => t.Test.Exam)
.Where(t => t.UserId == "0" || t.UserId == userId);
这个似乎可以工作,但是当我查看输出时,我看到了这样的内容:
[{"userTestId":2,
"userId":"0",
"testId":12,
"test":{
"testId":12,"examId":1,
"exam":{
"examId":1,"subjectId":1,
"tests":[
{"testId":13,"examId":1,"title":"Sample Test1",
"userTests":[
{"userTestId":3,
"userId":"0",
请注意,这开始重复并返回比我预期的更多的数据
这是因为Tests是一个集合,而不仅仅是一个对象,所以它没有UserTests属性。您可以使用lambda来指定多个子节点而不是单个子节点的孙子节点:
var exams = _examsRepository
.GetAll()
.Where(q => q.SubjectId == subjectId)
.Include(q => q.Tests.Select(t => t.UserTests))
.ToList();
请注意,不需要两次Include调用,因为如果包含孙子,则隐式包含子。