在EF中不存在2100个参数限制问题。
我在AdventureWorks数据库(在SQL Express 2008 R2中)上进行了测试:我尝试获取所有ProductCategoryId
值在(1、2、3)范围内的产品。
使用LINQ,生成的SQL WHERE
子句如下:
WHERE [t0].[ProductCategoryID] IN (@p0, @p1, @p2)
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [2]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
这导致了最大参数数量的问题,而使用EF 4.0则是这样的:
WHERE [Extent1].[ProductCategoryID] IN (1,2,3)
接下来,我已经使用EF测试了3000个值的列表:
var categoryList = Enumerable.Range(1, 3000).Select(i => (int?)i).ToArray();
using (var aw = new AdventureWorksEntities())
{
var products = aw.Products
.Where(p => categoryList.Contains(p.ProductCategoryID))
.ToList();
}
虽然这种方法非常低效,但它能够正常工作并产生预期的结果。
然而,也可以使用由Marc Gravell提供的InRange
扩展provided by Marc Gravell与EF一起使用,同时还要使用LINQKit library,如下所示:
using (var aw = new AdventureWorksEntities())
{
var products = aw.Products
.AsExpandable()
.InRange(p => p.ProductCategoryID, 1000, categoryList)
.ToList();
}
(AsExpandable
扩展定义在LINQKit中)
这将产生预期的结果(按块执行查询),并且根据列表中项目的数量和块的大小,可以比非分块解决方案更有效率。