#sql #linq #sql-server-2005
#sql #linq #sql-server-2005
Вопрос:
Примечание: Приложение C # 3.5 вызывает базу данных SQL Server 2005 на удаленном сервере.
Я разрабатываю двухэтапный процесс.
1) Я ищу в службе индексирования Windows список файлов, содержащих заданное слово, например «Bob».
2) Затем мне нужно получить список строк из таблицы DOCUMENT в базе данных SQL, передав список имен файлов из службы индексирования.
На данный момент я извлекаю список из службы индексирования И все строки из таблицы DOCUMENT, затем фильтрую их в коде. Это непрактично, поскольку имеется более 10 000 документов, а база данных подключена через брандмауэр.
Я рассматривал возможность создания запроса, такого как:
ВЫБЕРИТЕ DocName ИЗ Documents WHERE DocName IN ({список файлов из службы индексирования})
…но, учитывая, что список файлов может составлять тысячи, это не сработает.
Итак, что лучшее, что я могу сделать? Я не хочу запрашивать базу данных для всех 10000 строк и передавать их обратно через брандмауэр (занимает 10 минут). Мне как-то нужно передать список имен файлов, полученных из службы индексирования.
Как linq будет работать в этом сценарии?
Любой совет приветствуется.
Комментарии:
1. возможно, вы можете копировать файлы из службы индексирования в таблицу базы данных, например, каждую ночь? Тогда вы могли бы обойтись простым объединением двух таблиц. Я думаю, вам следует собрать все данные вместе, прежде чем вы сможете запросить их, теперь вы получаете все вместе на клиенте, что кажется громоздким.
2. краткий ответ: вставьте имена из службы индексирования во временную таблицу, соедините таблицу document и временную таблицу.
Ответ №1:
Если бы у вас был SQL Server 2008, вы могли бы использовать табличные параметры, но для 2005 года нет ничего более элегантного.
Самое простое решение, которое я могу придумать, это:
- Создайте таблицу в базе данных
- Массовая вставка результатов вашей службы индексирования в таблицу
- Присоедините свой запрос к этой таблице, чтобы отфильтровать результаты
- Извлеките загруженные результаты
Это не лучшее решение, но я не знаю, существует ли отличное решение — вот почему были созданы TVP.
Ответ №2:
Вы можете оценить различные решения для такого рода «масштабных» операций, возможно, нет необходимости использовать linq. Например, попробуйте реализовать хранимую процедуру на SQL Server, которая получает на входе список имен файлов и возвращает список документов.
Ответ №3:
Я выбрал решение, подобное тому, о котором упоминал Bazzz.
Я настроил ежевечернюю операцию по копированию требуемых полей из базы данных и установке мета-тегов в файлах документов (PDF-файлах). Затем метаданные могут быть использованы в службе индексирования; o)
Это оказалось хорошим решением для данного экземпляра, но в противном случае то, что сказал Халлайнзил, было бы лучшим вариантом, хотя и болезненным для Sql Server 2005.