Oce*_*t20 7 sql linq parameters entity-framework expression-trees
我正在将一些代码从LINQ-to-SQL迁移到Entity Framework.以前,当对从SQL Server(描述一个2100参数限制跑到这里),我用由Marc Gravell提供的解决方案在这里.正如他自己的回复中所述,它不适用于实体框架.
我对表达式完全没有经验,知道从哪里开始,但我正在寻找的本质上是相同的扩展方法,但适用于实体框架.提前感谢您提供的任何帮助.
Cri*_*scu 15
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]
Run Code Online (Sandbox Code Playgroud)
(导致最大参数编号问题),而使用EF 4.0,它看起来像这样:
WHERE [Extent1].[ProductCategoryID] IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)
接下来,我用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();
}
Run Code Online (Sandbox Code Playgroud)
虽然这是非常低效的,但它起作用并产生预期的结果.
但是,也可以使用Marc Gravell提供的InRange
扩展和EF,也可以使用LINQKit库,如下所示:
using (var aw = new AdventureWorksEntities())
{
var products = aw.Products
.AsExpandable()
.InRange(p => p.ProductCategoryID, 1000, categoryList)
.ToList();
}
Run Code Online (Sandbox Code Playgroud)
(AsExpandable
扩展名在LINQKit中定义)
这会产生预期的结果(以块的形式执行查询),并且根据列表中的项目数量,块的大小可以比非分块的解决方案更有效.
归档时间: |
|
查看次数: |
5733 次 |
最近记录: |