Linq - фильтровать дочерний список <object>, не влияя на количество родительских строк - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть сценарий, в котором мне нужно выполнить фильтрацию по дочернему элементу list<object> ResponseIssues , который включен в родительский элемент Вопрос , который также является list<object>. Для этого примера у меня есть 10 вопросов, которые я собираю из таблицы, которые мне всегда нужно будет проверять независимо от того, существуют ли ResponseIssues.

Похоже, есть несколько проблем с моим запросом. Первая проблема заключается в том, что число Вопросов изменяется от 10 до 1, поскольку в настоящее время у меня только один вопрос, связанный с ResponseIssues . Мне нужны все вопросы, чтобы вернуться.

Вторая проблема заключается в том, что когда я смотрю поближе на ResponseIssues child list<object>. Хотя я вижу записи, связанные с этим вопросом, он не отфильтровывает строки по SuveryPeriod и RespondentByQuarterId . Я ожидаю одну строку, и я получаю три строки, где две строки, где в предыдущем периоде. Та же проблема возникает с дочерним списком ответов.

Вот мой текущий код ниже. Любые идеи о том, как реструктурировать запрос, если он учитывает вышеуказанные проблемы и возвращает объект «Вопросы», а не что-то анонимное?

var question = await _dbContext.Questions
                 .Include(x => x.Responses)
                 .Include(x => x.ResponseIssues)
                 .Include(x => x.SurveySection)
                 .Include(x => x.Survey)
                 .Where(x => x.SurveyId == surveyId &&
                             x.Responses.Any(r => r.SiteUserId == siteUserId &&
                                                  r.SurveyPeriodId == surveyPeriodId &&
                                                  r.RespondentByQuarterId == 2
                                            ) &&
                                             x.ResponseIssues.Any(ri => ri.SurveyPeriodId == surveyPeriodId && 
                                                                        ri.RespondentByQuarterId == 2
                                           ))
                 .OrderBy(x => x.Position)
                 .ToListAsync();

1 Ответ

0 голосов
/ 02 апреля 2019

Я смог сделать это, разбив его на три отдельных запроса, а не на один.Мне все еще было бы любопытно узнать, есть ли у кого-то в сообществе способ сделать это одним запросом.

В любом случае, вот мой код ниже.Я могу обновить Родителя Вопросов, указав правильное количество строк как для Ответов, так и для Ответов, а также вернуть все вопросы.

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...