私は3つのエンティティを持っています:
Questionnaire.cs
:
public class Questionnaire
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Question> Questions { get; set; }
}
Question.cs
:
public class Question
{
public int Id { get; set; }
public string Text { get; set; }
public ICollection<Answer> 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);
そして、私は得ています
メッセージ= "プロパティ式 'q => {q.Answersの回答aからEquals([a] .UserId、__ userId_0)select [a]}'は無効です。式はプロパティアクセスを表す必要があります: 't = > t.MyProperty '。
この問題を解決する方法はありますか?
Include
またはIncludeThen
でのフィルタリングはサポートされていません。 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を持っていますあなたはただnavプロパティが必要です
モデルクラスは次のようになります
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();
ナビゲーションプロパティをメモリでフィルタリングできます。
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();