C# 检查sql server ce中是否存在项的最佳方法?

C# 检查sql server ce中是否存在项的最佳方法?,c#,.net,windows-phone-7,linq-to-sql,sql-server-ce,C#,.net,Windows Phone 7,Linq To Sql,Sql Server Ce,好的,所以我基本上是想确定在检查数据库中是否存在项时,哪种方法在性能方面更有效 我正在WP7上使用LINQtoSQL和SQLServerCE 我将把多个对象导入数据库。现在很有可能这些对象中的一些已经存在于数据库中,所以我需要在它们进入时检查每个项目,如果已经存在,则跳过它,否则添加它 我想到了两种方法。第一个是使用foreach并检查数据库中是否存在同名的对象: foreach(var item in items) { //Make individual call to db for

好的,所以我基本上是想确定在检查数据库中是否存在项时,哪种方法在性能方面更有效

我正在WP7上使用LINQtoSQL和SQLServerCE

我将把多个对象导入数据库。现在很有可能这些对象中的一些已经存在于数据库中,所以我需要在它们进入时检查每个项目,如果已经存在,则跳过它,否则添加它

我想到了两种方法。第一个是使用foreach并检查数据库中是否存在同名的对象:

foreach(var item in items)
{
    //Make individual call to db for every item
    var possibleItem = /*SQL SERVER STATEMENT WITH WHERE CONDITION*/;
}

尽管对数据库进行单独调用听起来相当耗费资源。因此,另一个想法是对数据库中的所有对象进行完全选择,并将它们存储在列表中。然后对foreach做了几乎相同的概念,除了现在我不必连接到db,我可以直接访问列表。您对这些方法有何看法?有更好的方法吗?

如果您可以轻松地对项目进行排序,您可以从数据库中进行选择,并在浏览数据库时逐步浏览列表,以确定哪些项目是新的。在保留内存的同时,这应该比多次选择快得多

using(var reader = cmd.ExecuteReader())
{
  while(reader.HasRows && reader.Read())
  {
    var id = reader.GetInt32(0);
    // test how id compares to the memory list
  }
}

但是如果内存不重要,为了简单起见,我可能只会将数据库中的所有键读入内存。

如果有疑问,请尝试-通常您应该尝试更改内容,这样您就不必对每个键进行foreach和检查-在大多数情况下,您可以基于此查询执行Where和foreach操作(如果您知道我的意思的话)但是没有代码你就不能说。但是我认为SqlCe会在内存中做一些索引,所以它不应该比基于列表的Where慢(它的查询性能很差,为O(n))是的,因为这是一个移动应用程序,内存是这里的一个关键问题。我不知道你在浏览数据库时单步浏览列表是什么意思。我不知道这是可能的。我添加了一个在命令对象上使用datareader的简短示例。我现在在打电话,所以如果格式很糟糕,我很抱歉。好吧,我恐怕我在这方面做得不好。但是有Linq2Sql,那么为什么不创建一个查询并通过它循环出对象呢?只要没有跟踪使对象留在内存中,这应该是一样的。@MattiasÅslund是的,我认为这是最好的方法。我怀疑一遍又一遍地查询数据库听上去不对。我还注意到,虽然查询一个请求的速度并不慢,但在执行多个请求时确实需要更长的时间。