首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用linq删除子对象

使用linq删除子对象
EN

Stack Overflow用户
提问于 2015-02-11 04:57:27
回答 3查看 1.7K关注 0票数 2

正在尝试从父对象中删除多个深子对象。

树是这样的:

Survey.SectionList.Section.QuestionList.Question.QuestionType

我希望是这样的:

Survey.SectionList.Section.QuestionList.Question

我正在从由系统的其他实例导出的XML文件导入测量对象。导出的一部分是QuestionType。当我导入调查并将其推入到一个测量对象中,然后使用db.Add跟随它时,将添加QuestionType记录,而不仅仅是引用现有记录。

(我想)我知道我可以把它全部放在一系列foreach循环中,以深入到问题层,但这似乎太老套了。

提前感谢你对这颗幼小的心的耐心。

EN

回答 3

Stack Overflow用户

发布于 2015-02-11 05:25:27

你可以得到所有的问题,然后修改它们:

给定:List<Survey> surveyList

代码语言:javascript
复制
List<Question> questions = surveyList.SelectMany(s => s.SectionList)
                .SelectMany(sl => sl.Section)
                .SelectMany(sct => sct.QuestionList)
                .SelectMany(ql => ql.Question).ToList();

foreach(Question q in questions)
    q.QuestionType = null;

或者,您可以通过使用"linq-to-objects更新“来获得更多的乐趣:

代码语言:javascript
复制
surveyList.SelectMany(s => s.SectionList)
                .SelectMany(sl => sl.Section)
                .SelectMany(sct => sct.QuestionList)
                .SelectMany(ql => ql.Question)
                .Select(q =>
                    {
                        q.QuestionType = null;
                        return q;
                    }).ToList();
票数 1
EN

Stack Overflow用户

发布于 2015-02-11 06:09:08

您可以覆盖DbContext类中的SaveChanges,并将QuestionType对象的状态设置为UnChanged

代码语言:javascript
复制
public override int SaveChanges()
{
    var oc = ((IObjectContextAdapter)this).ObjectContext;
    oc.DetectChanges();
    foreach (var ent in oc.ObjectStateManager
                          .GetObjectStateEntries(EntityState.Added)
                          .Select(e => e.Entity)
                          .OfType<QuestionType>())
    {
        oc.ObjectStateManager.ChangeObjectState(ent, EntityState.Unchanged);
    }
    return base.SaveChanges();
}

通过将状态设置为UnChangedQuestionQuestionType之间的关联将保持不变,但现在只保存外键值,而不保存QuestionType

票数 0
EN

Stack Overflow用户

发布于 2015-02-12 02:57:51

你们太棒了。谢谢你在我那差劲的帖子里给出了各种各样的真实答案。

这就是我昨天终于开始工作的原因,这样我就可以继续前进了。但是,在我添加了单元测试之后,我将重构您的一个响应。

代码语言:javascript
复制
private Survey PrepSurveyForAdd(Survey survey)
{
  //Loop through the sections
  foreach (SurveySection ss in survey.SurveySections)
  {
    foreach (SectionQuestion sq in ss.Section.SectionQuestions)
    {
      sq.Question.QuestionType = null;

    }
  }
  return survey;
}

我没有坚持下去的原因,以及我最初发帖的原因,是因为我不仅在向下引用这棵树时遇到了问题,而且因为我想在现实世界中学习更多关于Linq的知识,这对我来说很重要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28441599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档