2013-06-25 6 views
1

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

Мне интересно, есть ли удобный способ для вызова коллекции UpdateOnly(), и если нет, то мне интересно, будет ли мой лучший маршрут заключить транзакцию вокруг отдельных вызовов UpdateOnly() для каждого объекта модели. (И если нет, мне интересно узнать, как это сделать.)

Наконец-то, как в стороне - удивительный каркас - огромное спасибо Демису и всем остальным contributors!

ответ

2

В отсутствие ответа я применил обходное решение, упомянутое в моем вопросе (обертывание транзакции вокруг отдельных вызовов UpdateOnly(). Это казалось лучше, когда в рассматриваемой таблице не было много споров. Но когда мы приступили к тестированию производительности, этот цикл стал узким местом для всего приложения.

Я в конечном итоге посмотрел на источник ORMLite (который в ретроспективе я должен был иметь в первую очередь.) Вы можете использовать метод Update(this IDbConnection dbConn, string table = null, string set = null, string where = null) для массовых частичных обновлений в ORMLite. Например:

var ids = MyObjectList.Select(h => h.Id); 
    string idsCsv = string.Join(", ", ids); 
    string whereClause = "Id in (" + idsCsv + ")"; 
    const string setClause = "MyStatus = 'Queried'"; 
    db.Update("MyObject", setClause, whereClause);