2011-06-06 52 views
1

认为我有我的数据上下文MYDC叫MyObject的对象列表定义如下:更新列表,DB与LINQ到SQL

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到SQL查询?特别是,如果列表包含1,000个项目,我不会与DB交谈1,000次,所以我想知道是否使用foreach循环是要走的路。我需要什么样的查询?一个InsertOnSubmit?

感谢您的建议。

回答

0

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

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

您将需要2个数据库命中。首先获取所有对象,然后提交更改。

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

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

要获取已经在db中的项目,应该检查Intersect。然后你循环它们然后更新它们。

在您使用SubmitChanges之前,没有更新将发送到数据库。

+0

好的,如果我只是做了一个Insert并且已经有一个元素会发生什么;会跳过还是更新? – frenchie 2011-06-06 22:45:21

+0

@frenchie如果它在你插入的项目上设置了id,并且该项目已经在db中,则将引发异常 – 2011-06-07 09:15:05

+0

嗯,没有什么小事。 – frenchie 2011-06-07 12:53:53