2012-03-14 2 views
0

Хорошо, поэтому я в основном пытаюсь определить, какой путь более эффективен в работе, когда проверяете, существуют ли элементы в базе данных.Лучший способ проверить, существует ли элемент в sql server ce?

Я использую LINQ to SQL на WP7 с SQL Server CE.

Я собираюсь импортировать несколько объектов в базу данных. Теперь есть довольно хорошая вероятность того, что некоторые из этих объектов уже существуют в базе данных, поэтому мне нужно проверить каждый элемент, когда они входят, и если он уже существует, пропустите его, иначе добавьте его.

Было два подхода, которые приходили на ум. Первым использовал Еогеасп и проверить, существует ли объект в БД с тем же именем:

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

Выполнение индивидуальных вызовов БД, хотя звучит довольно ресурсоемкими. Таким образом, другая идея состояла в том, чтобы сделать полный выбор на всех объектах в db и сохранить их в списке. И тогда в значительной степени делаю ту же концепцию с foreach, но теперь мне не нужно подключаться к db, у меня есть прямой доступ к списку. Что вы думаете об этих подходах? Есть ли способ лучше?

+0

, когда вы сомневаетесь, просто попробуйте - нормалитесь, вы должны попытаться изменить ситуацию, чтобы вам не приходилось забирать и проверять каждый - в большинстве случаев вы можете делать Where, а затем foreach на основе этого запроса (если вы знаете, что я имею в виду), но без кода, который вы просто не можете сказать. Но я думаю, что SqlCe сделает некоторую индексацию в памяти, поэтому он не должен быть медленнее, чем a Where на основе списка (который имеет плохую производительность запросов O (n)) – Carsten

ответ

0

Если вы можете легко отсортировать свои товары, вы можете сделать выбор из базы данных и пройти через список при чтении через базу данных, чтобы определить, какие элементы являются новыми. Это должно быть намного быстрее, чем несколько выборок при сохранении памяти.

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

Но если память, если ее не беспокоит, я бы просто прочитал все ключи из базы данных в памяти для простоты.

+0

Да, поскольку это мобильное приложение, память является ключом вопрос здесь. Я не уверен, что вы подразумеваете, перейдя через список при чтении через базу данных. Я не знал, что это возможно. Как ты это делаешь? – loyalpenguin

+0

Я добавил короткий пример использования datareader в командном объекте. Im на телефоне прямо сейчас, поэтому мне жаль, если форматирование отстой. –

+0

Нет чтения на wp7 вправо? –

Смежные вопросы