只是为了得到这一点的方式...
var joinTry = from company in dc.Companies
join id in list on company.CompanyID equals id
select company;
不起作用。 LinqToSql不会让你加入。 “本地序列不能用于除Contains运算符之外的查询运算符的LINQ to SQL实现。”
var containsTry = from company in dc.Companies
where list.Contains(company.CompanyID)
select company;
确实有效。在可预见的
SELECT [t0].[CompanyID], [t0].[CompanyName]
FROM [Company] AS [t0]
WHERE [t0].[CompanyID] IN (@p0, @p1, @p2, @p3, @p4, @p5, ...
方式......为脏,因为这是,有没有认真更快的方法来获得整数列表到SQL Server。任何调用的开销时间比任何解析都要严重得多。
SELECT
c.CompanyId,
c.CompanyName
FROM Company c
WHERE CompanyID IN (1,2,3,4,5,6,7,8,9,10)
...是相同的执行速度...(由LINQ生成)
exec sp_executesql N'SELECT [t0].[CompanyID], [t0].[CompanyName]
FROM [Company] AS [t0]
WHERE [t0].[CompanyID] IN (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9)',N'@p0 int,@p1 int,@p2 int,@p3 int,@p4 int,@p5 int,@p6 int,@p7 int,@p8 int,@p9 int',@p0=1,@p1=2,@p2=3,@p3=4,@p4=5,@p5=6,@p6=7,@p7=8,@p8=9,@p9=10
...和是快两倍...
SELECT
c.CompanyId,
c.CompanyName
FROM Company c
/* @Test is a table variable with 1-10 in it */
INNER JOIN @Test t ON t.ID = c.CompanyID
您实际上不需要优化SQL Server对整数列表的处理。在IN()解决方案中,SQL将整数放入它随时随地生成的索引中。
真正的问题应该是......“我用6000个整数列表代表什么?”和“我应该把这份清单放在桌子上吗?”。任何采用6000个整数的客户端列表并将其发送到服务器的解决方案,与使用Contains()的解决方案相比,开销>>。如果你使用LinqToSQL,你必须在某种程度上出售给范式。
如果这仍然让你觉得脏乱,你可以尝试为任意限制列表创建一个表。两列,两个整数。然后,您可以将您的ID插入该表中,然后只需使用...
var searchTry = from company in dc.Companies
join search in dc.SearchLists on company.CompanyID equals search.ValueID
where search.SearchID == savedSearchID
select company;
该ID的子集可能是连续的?例如[1-5,10-12,14,19-32] – dtb 2012-01-04 17:14:40
有没有办法改变你的查询,这样你就不必发送这个ID了(就像有一个连接,或者你可以使用的子查询你解决服务器上的6,000个ID)? – JMarsch 2012-01-04 17:16:37
如果从另一个表中选择这些6000个ID,那么为什么不写一个SQL存储过程使用这些ID并将存储过程的结果返回给客户端? – 2012-01-04 17:23:31