使用Contains()时达到2100参数限制(SQL Server)

ban*_*n-G 57 linq sql-server parameters limit

from f in CUSTOMERS
where depts.Contains(f.DEPT_ID)
select f.NAME
Run Code Online (Sandbox Code Playgroud)

deptsIEnumerable<int>部门ID 的列表()

这个查询工作正常,直到你传递一个大的列表(比如大约3000 dept ids)..然后我得到这个错误:

传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确.此RPC请求中提供的参数太多.最高为2100.

我将查询更改为:

var dept_ids = string.Join(" ", depts.ToStringArray());
from f in CUSTOMERS
where dept_ids.IndexOf(Convert.ToString(f.DEPT_id)) != -1
select f.NAME
Run Code Online (Sandbox Code Playgroud)

使用IndexOf()修复错误但使查询变慢.有没有其他方法可以解决这个问题?非常感谢.

ADM*_*-IT 12

我的解决方案(指南 - > Guid列表):

List<tstTest> tsts = new List<tstTest>();
for(int i = 0; i < Math.Ceiling((double)Guides.Count / 2000); i++)
{
    tsts.AddRange(dc.tstTests.Where(x => Guides.Skip(i * 2000).Take(2000).Contains(x.tstGuid)));
}
this.DataContext = tsts;
Run Code Online (Sandbox Code Playgroud)

  • 与其使用 Ceiling(并在 Skip 中乘以)并递增 1,只需使用 Count 作为条件并递增 2000。同时将其设为常量以使其可配置。 (2认同)

Joe*_*oel 7

为什么不在sql中编写查询并附加你的实体?

自从我在Linq工作以来已经有一段时间了,但是这里有:

IQuery q = Session.CreateQuery(@"
         select * 
         from customerTable f
         where f.DEPT_id in (" + string.Join(",", depts.ToStringArray()) + ")");
q.AttachEntity(CUSTOMER);
Run Code Online (Sandbox Code Playgroud)

当然,你需要防止注射,但这不应该太难.

  • 警告:对于整数,这是可以的,但是使用字符串:注意SQL注入. (13认同)

归档时间:

查看次数:

64725 次

最近记录:

6 年,5 月 前