使用linq删除子对象

时间:2015-02-10 20:57:27

标签: c# linq entity-framework

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

这是一项调查,我试图在将QuestionType对象添加到数据库之前删除它(但保留QuestionType键)。

树是这样的:

Survey.SectionList.Section.QuestionList.Question.QuestionType

我想这样:

Survey.SectionList.Section.QuestionList.Question

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

(我想)我知道我可以把它全部放在一系列foreach循环中,以便进入问题层,但这看起来很老了。

提前感谢您对这个幼儿心灵的耐心。

3 个答案:

答案 0 :(得分:1)

您可以获得所有问题,然后进行修改:

给出:List<Survey> surveyList

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;

或者你可以通过使用&#34; linq-to-objects更新&#34;来获得更多的幻想:

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 :(得分:0)

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

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 s

答案 2 :(得分:0)

你们真是太棒了。感谢我的基本糟糕的帖子中的各种真实答案。

这就是我昨天终于开始工作了,所以我可以继续前进。但是,在我添加单元测试后,我将重构你的一个回复。

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的真实世界,这对我来说很重要,例如。