我有这个看似简单的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();
Run Code Online (Sandbox Code Playgroud)
我得到的错误是这样的:
附加信息:传入的请求包含太多参数.服务器最多支持2100个参数.减少参数数量并重新发送请求.
解决这个问题的最佳方法是什么?
我环顾四周,找到的解决方案看起来像这样:
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();
Run Code Online (Sandbox Code Playgroud)
这编译并没有抛出任何异常,但似乎忽略了Where条款SomeString.Contains
使此查询有效的解决方案是什么?
谢谢.
小智 11
简单 - 只要TheTAbleID包含少于2100个ID,那么这样做是不合法的.
将表切成2000块,然后分别查询每个块,可能是多个线程.
SQL in语句中不支持超过2100个值,但是您可以在具有超过2100行的表中使用in,因此您可以将数据插入表中并更改查询以in从表中选择进行检查
例如
Create TempIDs (bigint ID, uniqueidentifier guid)
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
同样,如果您可以从数据库中检索ID,则可以在sql中编写一个表值函数以返回ID并在代码中对该函数进行建模,假设其名称为fnGetIds。然后在您的代码中使用它,如下所示
var QueryOutput = (from x in TheDataContext.SomeTable
where TheDataContext.fnGetIds().Contains(x.ID) &&
x.Col1.Contains(SomeString) ||
x.Col2.Contains(SomeString))
select x.ID).ToList();
Run Code Online (Sandbox Code Playgroud)