DataView. RowFilter по сравнению с DataTable. Выберите () по сравнению с DataTable. Строки. Найдите ()

Рассмотрение кода ниже:

Dataview someView = new DataView(sometable)
someView.RowFilter = someFilter;

if(someView.count > 0) {  …. }

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

Решенный: тайна низкой производительности DataView с большим Recordsets
Массив DataRecord по сравнению с DataView: резкая разница в производительности

Поиск с помощью Google по этой теме, я нашел некоторые темы статей/форума, которые упоминают Таблицу данных. Выберите (), самостоятельно довольно ошибочно (не уверенный в этом) и показывает низкие результаты в различных сценариях.

На этом (Лучшие практики ADO.NET) тема на MSDN предложено, чтобы, если существует первичный ключ, определенный на таблице данных findrows (), или находит () методы использовались insted Таблицы данных. Выберите ().

Эта статья здесь (.NET 1.1) сравнивает всех трех подходов плюс пара больше. Но это для версии 1.1, таким образом, не уверенной, если они допустимы все еще теперь. Accroding к этому DataRowCollection. Найдите (), превосходит по характеристикам все подходы и Таблицу данных. Выберите (), превосходит DataView по характеристикам. RowFilter.

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

31
задан Aseem Gautam 17 May 2010 в 05:45
поделиться

2 ответа

Вы ищете «лучший подход к поиску строк в таблице данных», поэтому я сначала должен спросить: «лучший» для чего? Я думаю, что у любой техники есть сценарии, в которых она может лучше подходить, чем другие.

Во-первых, давайте посмотрим на DataView.RowFilter : DataView имеет некоторые преимущества в привязке данных. Он очень ориентирован на просмотр, поэтому имеет мощные функции сортировки, фильтрации или поиска, но создает некоторые накладные расходы и не оптимизирован для производительности. Я бы выбрал DataView.RowFilter для небольших наборов записей и / или там, где вы используете другие функции (например, прямую привязку данных к представлению).

Большинство фактов о DataView, которые вы можете прочитать в более ранних сообщениях, по-прежнему актуальны.

Во-вторых, вы должны предпочесть DataTable.Rows.Find , а не DataTable. Выберите , если вы хотите только одно попадание. Почему? DataTable.Rows.Find возвращает только одну строку. По сути, когда вы указываете первичный ключ, создается двоичное дерево. Это связано с некоторыми накладными расходами, но значительно ускоряет поиск.

Таблица данных.Выбор медленнее, но может оказаться очень полезным, если у вас несколько критериев и вы не заботитесь об индексированных или неиндексированных строках: он может найти практически все, но не оптимизирован для производительности. По сути, DataTable.Select должен пройти по всей таблице и сравнить каждую запись с критериями, которые вы ввели.

Надеюсь, вы найдете этот небольшой обзор полезным.

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

Небольшое ОБНОВЛЕНИЕ: Кстати, это может показаться немного выходящим за рамки вашего вопроса, но это почти всегда самое быстрое решение для фильтрации и поиска на бэкэнде. Если вам нужна простота и у вас есть SQL Server в качестве серверной части и .NET3 + на клиенте, выберите LINQ-to-SQL. Поиск объектов Linq очень удобен и создает запросы, которые выполняются на стороне сервера. LINQ-to-Objects - тоже очень удобный, но более медленный метод. Если вы еще не знали ....

53
ответ дан 27 November 2019 в 21:47
поделиться

Сообщение Томашейда прекрасно резюмирует:

  • DataView.RowFilter предназначен для привязки.
  • DataTable.Rows.Find предназначен для поиска только по первичному ключу .
  • DataTable.Select предназначен для поиска по нескольким столбцам, а также для указания порядка.

Избегайте создания множества DataView в цикле и использования их фильтров RowFilters для поиска записей. Это резко снизит производительность.

Я хотел добавить, что DataTable.Select может использовать индексы. Вы можете создать индекс для DataTable, создав DataView и указав порядок сортировки:

DataView dv = new DataView(dt);
dv.Sort = "Col1, Col2";

Затем, когда вы вызываете DataTable.Select () , он может использовать этот индекс при выполнении запроса. Мы использовали эту технику, чтобы серьезно повысить производительность там, где мы используем один и тот же запрос много-много раз. (Обратите внимание, что это было до того, как появился Linq.)

Уловка состоит в том, чтобы правильно определить порядок сортировки для оператора Select . Итак, если ваш запрос - «Col1 = 1 и Col2 = 4», вам понадобится «Col1, Col2», как в примере выше.

Обратите внимание, что создание индекса может зависеть от фактических вызовов для создания DataView. Нам пришлось использовать конструктор new DataView (DataTable dt) , а затем указать свойство Sort на отдельном шаге. Поведение может немного измениться с разными версиями .NET.

25
ответ дан 27 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: