2011-11-08 37 views
0

注意:C#3.5應用程序在遠程服務器上調用SQL Server 2005數據庫。SQL SELECT WHERE value IN('巨大的值列表')

我正在開發一個兩步過程。

1)我在Windows索引服務中搜索包含給定單詞的文件列表,例如「Bob」。

2)然後,我需要通過從索引服務中傳入文件名列表來檢索SQL DB中DOCUMENT表的行列表。

此刻,我從索引服務和DOCUMENT表中的所有行中檢索列表,然後在代碼中對它們進行過濾。這是不實際的,因爲有超過10,000個文檔並且數據庫通過防火牆。

我認爲創建一個查詢,如:

可採用DocName選擇從文檔中可採用DocName WHERE IN({從索引服務的文件列表})

...但鑑於文件的列表可能是數千它將無法工作。

那麼,我能做的最好的事情是什麼?我不想在數據庫中查詢所有10,000多行並將它們傳回防火牆(需要10分鐘)。我不知何故需要傳入從索引服務檢索到的文件名列表。

linq如何在這種情況下工作?

任何建議非常感謝。

+1

也許您可以將索引服務中的文件複製到數據庫表中,例如每晚?然後你可以在兩張桌子上做一個簡單的JOIN。我認爲你應該把所有的數據放在一起,然後才能查詢它,現在你把所有的東西都放在客戶端上,看起來很麻煩。 – Bazzz

+0

簡答題:將索引服務中的名稱插入臨時表中,加入文檔表和臨時表。 – Alex

回答

3

如果您有SQL Server 2008,您可以使用Table Valued Parameters,但對於2005,沒有什麼比較優雅的。

我能想到的最簡單的解決方法是:

  • 在數據庫中創建一個表
  • 批量插入您的索引服務的結果到表
  • 加入您的查詢該表進行過濾結果
  • 檢索filered結果

這不是一個很好的解決方案,但我不知道存在一個很好的解決方案 - 這就是TVP創建的原因。

0

您可以評估這種「大規模」操作的不同解決方案,可能不需要使用linq。例如,嘗試在SQL Server上實現一個存儲過程,該過程接收輸入文件名列表並返回文檔列表。

0

我選擇了類似於Bazzz提到的解決方案。

我已經設置了一個夜間操作,從數據庫中複製必需的字段並在文檔文件(PDF)上設置元標記。元數據然後可以用在索引服務中; o)

這已經被證明是這個實例的一個很好的解決方案,但是除此之外Halbenzil說會是最好的選擇,儘管在Sql Server 2005上是痛苦的。

相關問題