Выбор DataTable vs LINQ Select

Любые советы по использованию DataTable.Select по сравнению с LINQ Выберите при работе с DataTable в памяти?

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

(Я использую сторонний API, который предоставляет DataTable, который был предварительно заполнен из базы данных. Мне нужно отфильтровать эту дополнительную память.)

Ответ 1

Основываясь на личном опыте, я стараюсь избегать Datatable.Select. Я нахожу его медленным и имеет некоторые странные ошибки.

Одна ошибка (подтвержденная и документально подтвержденная Microsoft), с которой я столкнулся, заключалась в том, что DataTable.Select не всегда корректно оценивает AND и когда в заявлении есть скобки.

Например, (Col1 > 1) AND (Col < 10) может не возвращать правильные ответы, тогда как Col1 > 1 AND Col < 10 будет работать правильно.

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

Примечание: не вдаваясь в длительные объяснения, моя компания не использует базу данных для хранения данных. Все наших операций с DataTables включают в таблицы памяти, загруженные из плоских файлов. Поэтому я не говорю о LINQ 2 SQL, но LINQ to Dataset.

Ответ 2

Не упоминая LINQ, я бы не использовал DataTable.Select где угодно, если бы не было абсолютно так, поскольку в большинстве случаев это означает выполнение на клиенте того, что, вероятно, должно выполняться в базе данных.

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

Ответ 3

Хм, сравниваете ли вы данные с LINQ to SQL? Если да, то я бы сказал, что это просто канавные массивы, и отправляйтесь с L2S. DataTable.Select предполагает, что вы уже заполнили данные с данными. Это может привести к плохим проектам, где вы загружаете больше данных, чем вам нужно, просто для фильтрации в клиенте. Получите SQL Server, чтобы выполнять ваши запросы для вас, и работайте над набором результатов, который он вам дает. L2S будет считываться из базы данных только тогда, когда вы перебираете коллекцию, поэтому гораздо проще сформулировать ваши запросы до, попав в базу данных.

LINQ to SQL вводит некоторые издержки отладки, потому что может быть неудобно получить из него динамически генерируемый SQL (тогда как в наборах данных, которые вы поставляете SQL в первую очередь), но почти во всех других ситуациях это намного более элегантно, Особенно полезна отсроченная загрузка.

Если вы не работаете с базой данных, тогда я бы предпочел LINQ (специально известный как LINQ to Objects в этом сценарии ) над наборами данных. Синтаксис намного проще, и потому что нет никаких магических строк (т.е. Операторов SQL), тогда их легче протестировать, и вы получите предупреждения времени компиляции для опечаток и т.д.