【发布时间】:2019-01-03 17:50:30
【问题描述】:
我目前正在通过具有许多字段 { Table1Id, Table1Label, IsActive, ...} 的 IQueryable 进行“分页”,并且 PdcId 的 IQueryable 结果中可能有多个记录,如下所示:
var result = from a in _entities.table1
join b in _entities.table2 on new { a.Table1Id, a.Table1LevelId } equals new { Table1Id = b.Table2Id, Table1LevelId = b.Table2LevelId }
join c in _entities.Table3 on a.Table1Id equals c.Table1Id into cc from ccc in cc.DefaultIfEmpty()
where a.Valide == true
select new MeteringPointDetailModel
{
Table1Id = a.Table1Id,
Table1Label = a.Label,
IsActive = a.IsActive,
Table3Label = ccc.Label,
};
我尝试了这段代码,但是当我看到使用 sql profiler 在 sql 中生成的结果时,查询正在不停地运行! (生成多个sql查询)。
var data = await result.Where(i => result.GroupBy(p => p.Table1Id)
.Select(t => t.Key)
.Skip(query.Page).Take(query.PageSize)
.Contains(i.Table1Id)).ToListAsync();
如果我想先按 Table1Id 分组,然后跳过并采用不同的 Table1Id,我该怎么做。
例如:如果我的结果有两条记录,一条是 #50,另一条是 51,如果我按 50 页分页,我不会得到记录 51,我想要它。
【问题讨论】:
-
而不是
GroupBy/SelectSelect/Distinct怎么样?请注意,有时 EF Core 使用多个查询,它可能比单个查询更快,您只能通过测试来确定。此外,您确实需要OrderBy,因为GroupBy和Distinct不能保证分页顺序。 -
@NetMage 感谢您的建议,我尝试了 Select/Distinct 但对我不起作用,我回答了我的问题,您可以检查一下。
标签: c# linq c#-6.0 ef-core-2.1