实体框架达到2100参数限制

时间:2012-01-17 16:56:12

标签: sql linq entity-framework parameters expression-trees

我正在将一些代码从LINQ-to-SQL迁移到Entity Framework。以前,当从SQL Server(描述为here)的2100参数限制运行时,我使用了Marc Gravell here提供的解决方案。正如他自己的回复中所述,它不适用于实体框架。

我对表达式完全没有经验,知道从哪里开始,但我正在寻找的是基本相同的扩展方法,但适用于实体框架。提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:15)

EF中不存在2100参数限制问题。

我在the AdventureWorks database(在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();
}

虽然这是非常低效的,但它起作用并产生预期的结果。

但是,也可以将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中定义)

这会产生预期的结果(以块的形式执行查询),并且根据列表中的项目数量,块的大小可以比非分块的解决方案更有效。