2009-08-24 45 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

根据您的要求,您可以掰开的工作分成多个小块(第一千,一千二,等等)这将运行一定的风险,如果您的数据读写和变化频繁,但它可能给你一个有一点可扩展性,除了一口大口地拉回成千上万行之外。而且,如果你的数据可以部分地工作(即无需在内存中整个集合),您可以发送关闭块,而你是拉回下一大块在一个单独的线程来制作。

相关问题