为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
米琪卡哇伊 2022-11-22 16:32:54

我有一个场景,我需要过滤包含在父问题中的子list<object> ResponseIssues ,它也是一个. 对于这个例子,我有 10 个问题要从表中撤回,无论是否有 ResponseIssues,我总是需要撤回这些问题。 list<object>


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


第二个问题是,当我仔细观察ResponseIssues child时list<object>。当我看到与问题相关的记录时,它不会按SuveryPeriod和RespondentByQuarterId过滤掉行。我期待一行,我得到三行,其中两行来自上一时期。Responses 子列表也会出现同样的问题。


下面是我当前的代码。关于如何在考虑上述问题的情况下重组查询并返回 Questions 对象而不是匿名对象的任何想法?


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 回答

?
慕的地10843

TA贡献1539条经验 获得超8个赞

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


不管怎样,下面是我的代码。我能够使用 Responses 和 ResponseIssues 的正确行数更新 Questions Parent,并返回所有问题。


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;

    }

}


查看完整回答
反对 回复 2022-11-22
  • 1 回答
  • 0 关注
  • 7 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信