从集合中删除项目也从相关集合中删除所有项目

时间:2014-01-01 17:03:37

标签: c# linq entity-framework

请原谅稍微令人困惑的标题,我不知道如何最好地总结我的编码问题。

我正在使用实体框架来使用对象集合来执行INSERTS和UPDATES。有时必须插入一个项目,因为它不存在,有时它是更新,因为它在数据库中。我将我的集合与数据上下文进行比较,以了解哪个是。

public modelClaimDatabase EditPersonDependants(modelClaimDatabase Model)
{
    try
    {
        using (var CasaLatinaEntities = new CasaLatinaEntities())
        {
            // Do dependants logic - first find out if there are any
            if (Model.ModelDependants.Count > 0)
            {
                // collection of dependants from Database
                var qDependants = CasaLatinaEntities.tblDependants;
                // collection of dependants from Model
                var ModelDependants = Model.ModelDependants;

                // GET all dependants from the Model that do match the DB
                var UpdateList =
                    from m in ModelDependants
                    where qDependants.Any(q => q.PersonID == m.PersonID)
                    select m;

                // GET all dependants from the Model that don't match the DB
                var InsertList =
                    from m in ModelDependants
                    where !qDependants.Any(q => q.PersonID == m.PersonID)
                    select m;

                if (InsertList.Count() > 0)
                {
                    foreach (var dependant in InsertList)
                    {
                        Model.ModelDependants.Remove(dependant);
                        CreateDependant(dependant, Model);
                        Model.ModelDependants.Add(dependant);
                    }
                }

            }
        }
    }
    catch (Exception ex)
    {
    }
    return Model;
}

当我使用此代码时

Model.ModelDependants.Remove(dependant);

这行代码

if (InsertList.Count() > 0)

不再需要枚举任何内容。但是我没有从InsertList中删除我从模型中删除。

我这样做的原因是因为

CreateDependant(dependant, Model);

我正在对该对象进行更改,然后我想用新数据将其添加回我的模型。所以我将有一个对象的集合,它们会说“这是添加的新行”或“你已经更新了这一行”。

有没有人有更好的方法来编写这段代码?

1 个答案:

答案 0 :(得分:2)

我无法肯定地说,因为我没有设置测试它,但我想知道从结果中创建新列表是否会解决Count问题。

致电ToList()会创建一个新列表,因此当您从ModelDependants移除某个项目时,也不应将其从InsertList移除。

var InsertList = (from m in ModelDependants
                  where !qDependants.Any(q => q.PersonID == m.PersonID)
                  select m).ToList();