使用linq-to-sql将列表更新到DB

时间:2011-06-06 18:53:21

标签: c# asp.net linq

假设我有我的数据上下文MyDC和一个名为MyObject的对象列表,如下所示:

public class MyObject
{
  public int ObjectID {get;set;}
  public byte ObjectState {get;set;}
  public string ObjectInJson {get;set;}
}

我正在为一个名为ObjectsInJsonCache的表编写查询;此表的列名与对象的属性相同。当我在函数中收到MyObjects列表时,我想要插入项目(如果它不在数据库中)或者更新项目(如果已经存在)。

查询函数如下所示:

public static in CreateJsonCache(List<MyObject> TheListOfobjects)
{
    int NumberOfObjectsLoaded = 0;

    using ( MyDCdefinition MyDC = new MyDCdefinition())
    {
        ObjectsInJsonCache TheTable = new ObjectsInJsonCache();

        //do I use a foreach loop?
        //how do I switch insert/update?

        // this?: MyDC.ObjectsInJsonCache.InsertOnSubmit...
    }
    return NumberOfObjectsLoaded;
}

如何在linq-to-sql中编写查询?特别是,如果列表包含1,000个项目,我不会与数据库通信1000次,所以我想知道是否使用foreach循环是可行的。我需要什么样的查询?一个InsertOnSubmit?

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

通常,您需要2个列表。 1个已在数据库中的列表和一个要更新的列表。

您所做的就是首先获得不在数据库中的所有对象。如何处理这些很简单,只需InsertAllOnSubmit

您需要2次数据库点击。首先,您获得所有对象,然后提交更改。

很难从你的例子中编写完整的代码,所以我只是要解释一下。

要获取数据库中没有的所有项目,您将获取输入列表并使用Except。如果您不使用Linq创建的对象,则可能需要自定义比较器。此外,如果您没有设置不在数据库中的项目的ID,您可以检查ObjectID == default(int);是否为SubmitChanges,如果是新的。但这取决于您的ID处理。

要获取数据库中已有的项目,您应该检查Intersect。然后你循环它们然后只是更新它们。

在您使用{{1}}之前,不会向数据库发送任何更新。