【问题标题】:Getting rows from a SQL table matching a dictionary using LINQ使用 LINQ 从与字典匹配的 SQL 表中获取行
【发布时间】:2009-08-24 22:31:28
【问题描述】:

我有以下代码sn-p:

    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 表中的所有行,其中该行的特定列值与字典条目之一匹配?

【问题讨论】:

    标签: c# linq linq-to-sql dictionary


    【解决方案1】:

    LINQ to SQL 使用参数化的IN 语句来执行本地Contains()

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

    因此,您看到的错误是 SQL 用完了用于您的键的参数。我可以想到两个选择:

    1. 选择整个表并使用 LINQ to Objects 进行过滤。

    2. 从您的键生成表达式树:请参阅Option 2 here

    【讨论】:

      【解决方案2】:

      另一种选择是考虑如何填充 m_authors 以及是否可以将其作为查询元素本身包含在查询中,以便它变成服务器端连接/子选择。

      【讨论】:

        【解决方案3】:

        根据您的要求,您可以将工作分成多个较小的块(第一千、第二千等)除了一次性拉回数千行之外,还有更好的可扩展性。而且,如果您的数据可以部分处理(即没有将整个数据集放在内存中),您可以在拉回下一个块时发送块以在单独的线程中处理。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-31
          • 1970-01-01
          • 1970-01-01
          • 2018-12-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多