只是爲了得到這一點的方式...
var joinTry = from company in dc.Companies
join id in list on company.CompanyID equals id
select company;
不起作用。 LinqToSql不會讓你加入。 「本地序列不能用於除Contains運算符之外的查詢運算符的LINQ to SQL實現。」
var containsTry = from company in dc.Companies
where list.Contains(company.CompanyID)
select company;
確實有效。在可預見的
SELECT [t0].[CompanyID], [t0].[CompanyName]
FROM [Company] AS [t0]
WHERE [t0].[CompanyID] IN (@p0, @p1, @p2, @p3, @p4, @p5, ...
方式......爲髒,因爲這是,有沒有認真更快的方法來獲得整數列表到SQL Server。任何調用的開銷時間比任何解析都要嚴重得多。
SELECT
c.CompanyId,
c.CompanyName
FROM Company c
WHERE CompanyID IN (1,2,3,4,5,6,7,8,9,10)
...是相同的執行速度...(由LINQ生成)
exec sp_executesql N'SELECT [t0].[CompanyID], [t0].[CompanyName]
FROM [Company] AS [t0]
WHERE [t0].[CompanyID] IN (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9)',N'@p0 int,@p1 int,@p2 int,@p3 int,@p4 int,@p5 int,@p6 int,@p7 int,@p8 int,@p9 int',@p0=1,@p1=2,@p2=3,@p3=4,@p4=5,@p5=6,@p6=7,@p7=8,@p8=9,@p9=10
...和是快兩倍...
SELECT
c.CompanyId,
c.CompanyName
FROM Company c
/* @Test is a table variable with 1-10 in it */
INNER JOIN @Test t ON t.ID = c.CompanyID
您實際上不需要優化SQL Server對整數列表的處理。在IN()解決方案中,SQL將整數放入它隨時隨地生成的索引中。
真正的問題應該是......「我用6000個整數列表代表什麼?」和「我應該把這份清單放在桌子上嗎?」。任何採用6000個整數的客戶端列表並將其發送到服務器的解決方案,與使用Contains()的解決方案相比,開銷>>。如果你使用LinqToSQL,你必須在某種程度上出售給範式。
如果這仍然讓你覺得髒亂,你可以嘗試爲任意限制列表創建一個表。兩列,兩個整數。然後,您可以將您的ID插入該表中,然後只需使用...
var searchTry = from company in dc.Companies
join search in dc.SearchLists on company.CompanyID equals search.ValueID
where search.SearchID == savedSearchID
select company;
該ID的子集可能是連續的?例如[1-5,10-12,14,19-32] – dtb 2012-01-04 17:14:40
有沒有辦法改變你的查詢,這樣你就不必發送這個ID了(就像有一個連接,或者你可以使用的子查詢你解決服務器上的6,000個ID)? – JMarsch 2012-01-04 17:16:37
如果從另一個表中選擇這些6000個ID,那麼爲什麼不寫一個SQL存儲過程使用這些ID並將存儲過程的結果返回給客戶端? – 2012-01-04 17:23:31