Рассмотрение кода ниже:
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.
Таким образом, я вполне смущен на том, что могло бы быть лучшим подходом к нахождению строк в таблице данных. Или нет никакого единственного хорошего способа сделать это, несколько решений существуют в зависимости от сценария?
Вы ищете «лучший подход к поиску строк в таблице данных», поэтому я сначала должен спросить: «лучший» для чего? Я думаю, что у любой техники есть сценарии, в которых она может лучше подходить, чем другие.
Во-первых, давайте посмотрим на 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 - тоже очень удобный, но более медленный метод. Если вы еще не знали ....
Сообщение Томашейда прекрасно резюмирует:
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.