Linq-在不影响父级行数的情况下过滤子级列表<object>

时间:2019-04-02 13:36:44

标签: c# entity-framework linq

我有一个场景,需要过滤父级问题所包含的子级list<object> ResponseIssues }}。对于此示例,我要从一个表中撤回10个问题,无论是否有ResponseIssues,我将始终需要撤回该问题。

我的查询似乎有几个问题。第一个问题是问题的数量从10个增加到1个,因为我目前只有一个与 ResponseIssues 相关的问题。我需要所有问题才能回来。

第二个问题是,当我仔细观察 ResponseIssues list<object>时。当我看到与该问题相关的记录时,它没有按 SuveryPeriod RespondentByQuarterId 过滤出行。我期望有一行,而我得到的是三行,其中上一行有两行。对于“响应”子级列表,也会发生相同的问题。

这是我下面的当前代码。关于如何将查询归因于上述问题并返回Questions对象而不是匿名对象的任何想法?

list<object>

1 个答案:

答案 0 :(得分:0)

我能够通过将其分解为三个单独的查询而不是一个单独的查询来完成上述操作。我仍然想知道社区中是否有人可以将其作为一个查询来完成。

无论如何,这是下面的代码。我可以使用“响应”和“响应问题”的正确行数来更新“问题父级”,并返回所有问题。

var question = await _dbContext.Questions
                                .Include(x => x.SurveySection)
                                .Include(x => x.Survey)
                                .Where(x => x.SurveyId == surveyId)
                                .OrderBy(x => x.Position)
                                                  .ToListAsync();

var responses = await _dbContext.Responses
                                .Where(x => x.SiteUserId == siteUserId &&
                                            x.SurveyPeriodId == surveyPeriodId)
                                .ToListAsync();

var responseIssues = await _dbContext.ResponseIssues
                                .Where(x => x.SurveyPeriodId == surveyPeriodId &&
                                            x.SiteUserId == siteUserId)
                                .ToListAsync();


foreach (var item in question)
{
    var foundResponse = responses.Where(x => x.QuestionId == item.Id).ToList();
    var foundResponseIssue = responseIssues.Where(x => x.QuestionId == item.Id).ToList();

    if (foundResponse != null)
    {
        item.Responses = foundResponse;
    }

    if (foundResponseIssue != null)
    {
        item.ResponseIssues = foundResponseIssue;
    }
}