簡體   English   中英

EF Core 2.1通過跳過進行分組

[英]EF Core 2.1 group by with skip and take

我當前正在通過IQueryable進行“分頁”,該IQueryable具有許多字段{Table1Id,Table1Label,IsActive,...},並且在IQueryable結果中可能存在多個PdcId的記錄,如下所示:

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,而我想要它。

那就是我為我所做的工作:

解決方案1

var dataTable1 = (from a in _entities.table1 
                  where a.Valide == true 
                  select new {...}).Skip(query.Page).Take(query.PageSize);

var result = from a in dataTable1
         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()                         
         select new MeteringPointDetailModel
         {
            Table1Id = a.Table1Id,
            Table1Label = a.Label,
            IsActive = a.IsActive,                                     
            Table3Label = ccc.Label,                 
         };

var data = await result.ToListAsync();

解決方案2

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,                 
         };

result = !string.IsNullOrWhiteSpace(query.Table3Label) ? result.Where(c => c.Table3Label.ToLower().Contains(query.Table3Label.ToLower())) : result;

var table1Ids = await result.OrderBy(p => p.Table1Id)
                            .Select(p => p.Table1Id).Distinct()
                            .Skip(query.Page).Take(query.PageSize)
                            .ToListAsync();

var data = await result.Where(p => table1Ids.Contains(p.Table1Id)).ToListAsync();

如果示例中指定的聯接表中有子句條件(搜索條件),則解決方案2更有用。

希望它會幫助某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM