EF Core 2.1 группа с пропустить и взять - PullRequest
0 голосов
/ 03 января 2019

Я в настоящее время "разбираюсь" через 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 с помощью SQL Server Profiler, запрос выполняется без остановки !!(создать несколько запросов 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 Ответ

0 голосов
/ 04 января 2019

Вот что я сделал и работал для меня:

Раствор 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 более полезно, если в объединяемых таблицах есть условие условия (критерии поиска), как указано в примере.

Надеюсь, это кому-нибудь поможет.

...