2009-08-24 48 views
0

字典我有下面的代碼片斷:從SQL表獲取的行匹配使用LINQ

var matchingAuthors = from authors in DB.AuthorTable 
          where m_authors.Keys.Contains(authors.AuthorId) 
          select authors; 

    foreach (AuthorTableEntry author in matchingAuthors) 
    { 
     .... 
    } 

其中m_authors是包含「作者」條目的字典,並且DB.AuthorTable是一個SQL表。當m_authors的大小超過一定值(約3000項標誌的地方),我得到一個異常:

System.Data.SqlClient.SqlException: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. 
Too many parameters were provided in this RPC request. The maximum is 2100. 

有沒有什麼辦法可以解決這個問題,並具有較大規模的字典工作?或者,有沒有更好的方式來獲得一個SQL表,其中該行的特定列值相匹配的字典條目之一的所有行?

回答

2

的LINQ to SQL使用參數化IN語句來執行本地Contains()

... 
WHERE AuthorId IN (@p0, @p1, @p2, ...) 
... 

所以你看到的錯誤是SQL跑出來的參數,使用您的鑰匙。我可以考慮兩種選擇:

  1. 選擇整個表格並使用LINQ to Objects進行過濾。

  2. 從碼生成一個表達式樹:看到Option 2 here

0

另一種選擇是考慮如何填充m_authors以及是否可以包含在查詢的查詢元素本身,以便它變成一個服務器端的加入/子選擇。

0

根據您的要求,您可以掰開的工作分成多個小塊(第一千,一千二,等等)這將運行一定的風險,如果您的數據讀寫和變化頻繁,但它可能給你一個有一點可擴展性,除了一口大口地拉回成千上萬行之外。而且,如果你的數據可以部分地工作(即無需在內存中整個集合),您可以發送關閉塊,而你是拉回下一大塊在一個單獨的線程來製作。

相關問題