假设我有我的数据上下文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?
感谢您的建议。
答案 0 :(得分:0)
通常,您需要2个列表。 1个已在数据库中的列表和一个要更新的列表。
您所做的就是首先获得不在数据库中的所有对象。如何处理这些很简单,只需InsertAllOnSubmit
。
您需要2次数据库点击。首先,您获得所有对象,然后提交更改。
很难从你的例子中编写完整的代码,所以我只是要解释一下。
要获取数据库中没有的所有项目,您将获取输入列表并使用Except。如果您不使用Linq创建的对象,则可能需要自定义比较器。此外,如果您没有设置不在数据库中的项目的ID,您可以检查ObjectID == default(int);
是否为SubmitChanges
,如果是新的。但这取决于您的ID处理。
要获取数据库中已有的项目,您应该检查Intersect。然后你循环它们然后只是更新它们。
在您使用{{1}}之前,不会向数据库发送任何更新。