我以为我了解 LINQ 还是我了解了,或者它可能是一个令人讨厌的 Oracle 提供程序错误?
遇到一个非常令人沮丧的情况,我想在淘汰应用程序中实现分页。使用 Troy Goode 的 PagedList Mvc 库,我可以看到代码从返回两个项目的搜索转换为 15 个项目的结果(我已将分页设置为每个 15 个项目)。在 SQL Server 2005/2008 中工作得非常好,但使用 Oracle.DataAccess.dll v11.2.3/v4.112.3 时效果不佳(取决于版本号的读取方式)。
我在 Linq 中做了这样的搜索结果:
var entities = _context.Entities;
var q = !string.IsNullOrEmpty(search)
? entities
.Where(a => a.PRODUCT_NUM.ToUpper().Contains(search.ToUpper())
|| a.PRINT_NAME.ToUpper().Contains(search.ToUpper()))
: entities;
var result = q.OrderBy(e => e.UPDATE_DATE == null)
.ThenByDescending(e => e.UPDATE_DATE)
.Select(r => new EntityModel
{
Id = r.ID,
Num = r.PRODUCT_NUM,
Name = r.PRINT_NAME,
City = r.City.PRINT_NAME,
State = r.City.State.PRINT_NAME,
EntityType = r.ENTITY_TYPE,
CompanyType = r.COMPANY_TYPE,
UpdateDate = r.UPDATE_DATE
})
.ToPagedList(pageNumber, 15);
现在,使用即时窗口,我可以让它返回 2 个项目,但是当它通过分页过程时,它会返回 15 个项目。
首先想到,我有缓存问题还是什么?但深入研究了 PagedList 库。https://github.com/TroyGoode/PagedList
让我们看看传递给 PagedList 的对象,我会告诉你返回的记录数。在 PagedList 内部,IQueryable 对象被称为超集并最终返回一个列表,但请查看当我通过即时窗口查询列表时得到的结果。我只是想这将是向你展示的最好方式......
?superset.Take(pageSize).Count()
2
?superset.Count()
51114
?superset.Skip(0).Take(pageSize).Count()
2
?superset.ToList().Count()
2
?superset.Skip(0).Take(pageSize).ToList().Count()
15
?superset.Take(pageSize).ToList().Count()
15
对我来说最有趣的是,当我们执行 ToList() 时,它会返回 15 条记录。是 Oracle ODP.NET 提供程序问题吗?我启动了 Ayende 的 Entity Framework Provider efprof.com并看到正在生成的 Oracle 查询,将其复制粘贴到 TOAD,它确实返回 2 项而不是 15 项。
我肯定错过了一些东西。
谢谢,-罗布