如何向ThenInclude添加where子句

我有3个实体:

Questionnaire.cs

 public class Questionnaire { public int Id { get; set; } public string Name { get; set; } public ICollection Questions { get; set; } } 

Question.cs

 public class Question { public int Id { get; set; } public string Text { get; set; } public ICollection Answers { get; set; } } 

Answer.cs

 public class Answer { public int Id { get; set; } public string UserId { get; set; } public string TextAnswer { get; set; } } 

所以我用答案保存了调查问卷,但现在我想找回问题及其答案的过滤问卷。 所以我写了linq,但它给我一个错误,有什么我做错了吗? 这是一个例子:

 questionnaire = _context.Questionnaires.Include(qn => qn.Questions) .ThenInclude(question => question.Answers.Where(a => a.UserId == userId)) .FirstOrDefault(qn => qn.Id == questionnaireId); 

我正在接受

Message =“属性表达式’q => {来自q.Answers中的答案a,其中Equals([a] .UserId,__ userId_0)选择[a]}’无效。表达式应代表属性访问:’t = > t.MyProperty’。

任何想法如何解决这个问题?

不支持在IncludeIncludeThen过滤。 使用Select创建投影:

 questionnaire = _context.Questionnaires .Select(n => new Questionnaire { Id = n.Id, Name = n.Name, Questions = n.Questions.Select(q => new Question { Id = q.Id, Text = q.Text, Answers = q.Where(a => a.UserId == userId).ToList() }).ToList() }) .FirstOrDefault(qn => qn.Id == questionnaireId); 

关于这个问题有一个github问题: https : //github.com/aspnet/EntityFramework/issues/3474

我认为你需要在你的答案中有一个问题的导航属性,因为答案应该有一个问题ID。 你已经有了这个FK,你只需要一个导航属性

你的模型类看起来像这样

 public class Answer { public int Id { get; set; } public string UserId { get; set; } public string TextAnswer { get; set; } // added in model public Question Question { get; set; } } 

和这样的查询

  var answers = ctx.Answers.Include(q=>q.Question).Where(a =>a.UserId=="1").ToList();