1

我以为我了解 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 项。

我肯定错过了一些东西。

谢谢,-罗布

4

0 回答 0