C# 传入请求的参数太多。服务器最多支持2100个参数

C# 传入请求的参数太多。服务器最多支持2100个参数,c#,linq,C#,Linq,我有一个看似简单的linq-to-sql查询,它在多个列中搜索一些数据;大概是这样的: List<long> TheTableIDs = list of IDs (sometimes more than 2100) var QueryOutput = (from x in TheDataContext.SomeTable where TheTableIDs.Contains(x.ID) &&

我有一个看似简单的linq-to-sql查询,它在多个列中搜索一些数据;大概是这样的:

List<long> TheTableIDs = list of IDs (sometimes more than 2100)

var QueryOutput = (from x in TheDataContext.SomeTable

                   where TheTableIDs.Contains(x.ID) &&

                   x.Col1.Contains(SomeString) || 
                   x.Col2.Contains(SomeString))

                   select x.ID).ToList();
var QueryOutput = TheDataContext.SomeTable.AsEnumerable()

        .Join(TheTableIDs, x => x.LeadID, ci => ci, (x, ci) => x)

        .Where(x => SomeString.Contains(x.Col1) == true ||
                    SomeString.Contains(x.Col2) == true)

        .Select(x => x.ID).ToList();
这将编译并不会引发任何异常,但似乎会忽略带有SomeString.Contains的Where子句

使此查询工作的解决方案是什么


谢谢。

简单-只要表格ID包含的ID少于2100个,那么这样做是不合法的


将表分为2000个块,然后分别查询每个块,可能是多个线程。

SQL在in语句中不支持超过2100个值,但您可以将in与超过2100行的表一起使用,以便将数据插入表中,并通过从该表中选择来更改查询以签入

比如说

Create TempIDs (bigint ID, uniqueidentifier guid)
guid列用于防止混合不同的用户数据

在代码中

Guid myKey = Guid.New();
List<long> TheTableIDs = list of IDs (sometimes more than 2100)
TheDataContext.TempIDs.InsertAllOnSubmit(TheTableIDs.select(i => new TempIDs{ID = i, Guid = mykey});
TheDataContext.SubmitChanges();

var QueryOutput = (from x in TheDataContext.SomeTable

                   where TheDataContext.TempIDs.Contains(x.ID) &&

                   x.Col1.Contains(SomeString) || 
                   x.Col2.Contains(SomeString))

                   select x.ID).ToList();

我得到了这个,我没有办法使用2100个参数!另一件事正在进行中

仔细检查后,我发现我在一个循环中添加了5个参数,但是源对象没有被清除,所以要插入的对象列表越来越大

 Dim reportNum = 1

                For Each report In wwo.wwoWeatherReport.listOfForecasts
                    'whack these into the  regionsAndCountries
                    db.addParameter("@forecastAirTemp" & reportNum, report.listOfhourlyForecasts(0).hourlyForecast_tempC)
                    db.addParameter("@forecastRainFall" & reportNum, report.listOfhourlyForecasts(0).hourlyForecast_precipMM)
                    reportNum = reportNum + 1

                Next
我必须预先调暗一个新的wwo对象,它会对它进行排序

Dim wwo As New wwwoManager

Dim reportNum = 1  ...
使用2 where子句:

List<long> TheTableIDs = list of IDs (sometimes more than 2100)

var _QueryOutput = (from x in TheDataContext.SomeTable
    where x.Col1.Contains(SomeString) || x.Col2.Contains(SomeString))
    select x.ID).ToList();

var QueryOutput = _QueryOutput.Where(w => TheTableIDs.Contains(w)).ToList();
这里的问题是使用Contains,它需要位于单独的查询中:

List<long> TheTableIDs = list of IDs (sometimes more than 2100)

var QueryOutput = (from x in TheDataContext.SomeTable

                   where TheTableIDs.Contains(x.ID) 

                   select x.ID).ToList();

foreach(var s in QueryOutput){
   if(x.Col1.Contains(SomeString) || x.Col2.Contains(SomeString)){
      //do something
   }
}
已更改此查询:

var z = (from b in db.GradeChangeHistories
    where m_list.Contains(b.SessionKey) 
    select b);
对此,它的工作原理是:

var z = (from b in db.GradeChangeHistories        
    select b).ToList().Where(x => m_list.Contains(x.SessionKey));

这不是一个插入查询。@ FrangeIe在“知道”中,考虑到您有大约2500个值来检查它,因此创建一个临时表,将所有2500项插入到该表中,而不是在1、2、3、…、2500中的列中使用“从VITE中选择VALL的列,其中INI中的值的数量没有限制,并且理解您的解决方案。这对某些人来说是可行的;对我来说,我决定将列表分块,并使用TLP并行执行多个查询,因为使用我已有的代码似乎更简单。但我确实喜欢你的方法;这种方法的问题有两个:首先,你需要一个临时表,这在LINQ中很棘手。第二,LINQ进行了2500次插入,由于非最佳SQL非常慢,插入速度非常慢。解决方案是使用SqlBUlkInsert,但这在代码和远离LINQ方面更加复杂。是的,所有这些都应该由EF透明地处理——遗憾的是,事实并非如此。从性能角度看,这是好的,但从C层中去掉了逻辑。如果你这样做是好的,但这是一个笨拙的解决办法。我希望他们不被需要。可悲的是,他们是。我不喜欢的是每次有人需要LINQ语句的列表时都编写服务器端tvf;好,谢谢,;最后我把我的列表分开,并行运行查询。效率太低了。如果使用IDs过滤器返回的记录数是2500,而没有ID过滤器返回的记录数是数百万,那么您肯定不希望在客户端执行此操作。在服务器端必须有一种更好的方法。
var z = (from b in db.GradeChangeHistories
    where m_list.Contains(b.SessionKey) 
    select b);
var z = (from b in db.GradeChangeHistories        
    select b).ToList().Where(x => m_list.Contains(x.SessionKey));