我正在将一些代码从LINQ-to-sql迁移到Entity Framework.以前,当从sql Server(描述为
here)的2100参数限制运行时,我使用了Marc Gravell
here提供的解决方案.如他自己的响应中所述,它不适用于Entity Framework.
我对表达式完全没有经验,知道从哪里开始,但我正在寻找的是基本相同的扩展方法,但适用于实体框架.提前感谢您提供的任何帮助.
解决方法
EF中不存在2100参数限制问题.
我在the AdventureWorks database上运行了一个测试(在sql Express 2008 R2中):我正在尝试将所有产品放在ProductCategoryId的值范围内(1,2,3).
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,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(); }
虽然这是非常低效的,但它起作用并产生预期的结果.
但是,也可以使用带有EF的InRange扩展provided by Marc Gravell,也可以使用LINQKit library,如下所示:
using (var aw = new AdventureWorksEntities()) { var products = aw.Products .AsExpandable() .InRange(p => p.ProductCategoryID,1000,categoryList) .ToList(); }
(AsExpandable扩展在LINQKit中定义)