web-dev-qa-db-ja.com

ThenIncludeにwhere句を追加する方法

私は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 '。

この問題を解決する方法はありますか?

11
user4229770

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

11
Pawel Maga

回答には質問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();
1
Yashveer Singh

ナビゲーションプロパティをメモリでフィルタリングできます。

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();
0
Ahmet Arslan