linq 如何在ThenInclude [duplicate]中添加where子句

f45qwnt8  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(134)

此问题在此处已有答案

Filtering on Include in EF Core(共10个答案)
三个月前关门了。
我有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);

而我却越来越
Message =“属性表达式'q =〉{来自q.Answers where Equals([a].UserId,__userId_0)select [a]}'无效。该表达式应表示属性访问权限:“t =〉t.我的属性”。
有什么办法可以解决这个问题吗?

eoxn13cs

eoxn13cs1#

不支持在IncludeThenInclude中进行筛选。请使用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

zed5wv10

zed5wv102#

我认为您需要在答案中有一个question的导航属性,因为答案应该有一个question 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();
cigdeys3

cigdeys33#

您可以在内存上筛选导航属性:

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();

相关问题