I have 3 entities:
Questionnaire.cs
:
public class Questionnaire
{
public int Id { get; set; }
public string Name { get; set; }
I think you need to have a navigation property of question in your answer because answer should have an question Id . You have this FK already you just need a nav property
Your model class look like this
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; }
}
and query like this
var answers = ctx.Answers.Include(q=>q.Question).Where(a =>a.UserId=="1").ToList();
Filtering in Include
or IncludeThen
is not supported. Create projection by using 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);
There is a github issue about this problem: https://github.com/aspnet/EntityFramework/issues/3474
You can have navigation properties filtered on memory:
var questionnaire= _context.Questionnaire.FirstOrDefault(qn => qn.Id == questionnaireId);
questionnaire.Answers = _context.Entry(questionnaire)
.Collection(b => b.Answers )
.Query()
.Where(a => a.UserId == userId).ToList();