Sql server 如何绕过Linq to SQL.Contains中的参数限制

Sql server 如何绕过Linq to SQL.Contains中的参数限制,sql-server,linq-to-sql,Sql Server,Linq To Sql,我有一个耗时的Linq到SQL查询,看起来像:database.GetTable.Where……Join…….Join…….Join…….Selecta=>new XResult…….ToArray。它的工作速度相当慢,我试图通过将所有XResult缓存到静态列表中来加速它 为此,我添加了。where=>!cachedResults.Containsa进入查询序列,但我遇到了问题:传入的表格数据流TDS远程过程调用RPC协议流不正确。此RPC请求中提供的参数太多。最大值为2100 所以。。。是否

我有一个耗时的Linq到SQL查询,看起来像:database.GetTable.Where……Join…….Join…….Join…….Selecta=>new XResult…….ToArray。它的工作速度相当慢,我试图通过将所有XResult缓存到静态列表中来加速它

为此,我添加了。where=>!cachedResults.Containsa进入查询序列,但我遇到了问题:传入的表格数据流TDS远程过程调用RPC协议流不正确。此RPC请求中提供的参数太多。最大值为2100

所以。。。是否有可能重新设计查询以绕过SQL中的参数限制?也许是临时桌?或者以某种方式重新设计缓存机制?有什么想法吗

更新:我尝试将所有缓存的XResults合并到字符串中,然后执行。where=>SqlMethods.likeemergedresults,%|+a.Id.ToString+|%。。它不会崩溃,甚至可能还能工作,但我无法得到结果——我得到了SQL超时。所以这不是可接受的解决办法。还有其他想法吗?

我的最终解决方案

在database create table valued函数中,该函数以VARBINARYMAX的形式接收合并ID,将其拆分并返回INTs表:

将其从服务器资源管理器拖到DBML设计器


在Linq to SQL序列中使用它,就像其他内置方法一样,例如,我使用它如下:database.GetTable.Joindatabase.splitidscovertidstobinaryids,……在哪里……加入…………加入…………加入…………选择a=>new XResult…………ToArray

能否将查询作为存储过程或视图重新写入数据库,并从前端调用它?我可以创建存储过程或视图,但它如何帮助我不向其传递20000个参数?一个解决方案是传递将参数作为单个参数(以逗号分隔的参数字符串)发送到存储过程。
CREATE FUNCTION [dbo].[SplitIds]
(   
    @data VARBINARY(MAX)
)
RETURNS @result TABLE(Id INT)
AS
BEGIN
    IF @data IS NULL
        RETURN 
    DECLARE @ptr INT = 0, @size INT = 4
    WHILE   (@ptr) * @size < LEN(@data)
    BEGIN
        INSERT INTO @result(Id)
        VALUES(SUBSTRING(@data, (@ptr* @size) + 1, @size))
        SET @ptr += 1
    END
    RETURN
END