Как выполнить пропуск и взятие в Linq с оптимизированным объединением нескольких таблицC#

Место общения программистов C#
Ответить
Anonymous
 Как выполнить пропуск и взятие в Linq с оптимизированным объединением нескольких таблиц

Сообщение Anonymous »

Как написать запрос linq, который делает то же самое, что и этот оператор SQL:

Код: Выделить всё

select *
from [dbo].[LitEdit] as le
inner join [dbo].[LitEditJob] as lej on  lej.BulkEditId = le.Id
inner join [dbo].[LitEditJobTask] as job on job.litEditJobId = lej.Id
where lej.LitProcessId = 'ABC002512'
and job.State = 'init'
order by job.LitNumber
offset 10 rows
fetch next 10 rows only
У меня возникла проблема с производительностью фактического запроса из-за большого объема данных в таблице LitEditJobTasks:

Код: Выделить всё

var retval = await context.LitEditJob
.Include(j => j.litEdit)
.ThenInclude(b => b.LitEditJobs)
.ThenInclude(jb => jb.LitEditJobTasks)
.Where(j => j.LitProcessId == "ABC002512")
.FirstOrDefaultAsync(cancellationToken);
Я пробовал несколько вещей, например

Код: Выделить всё

    var jobs = await context.LitEditJob
.Include(j => j.LitEdit)
.ThenInclude(b => b.LitEditJobs)
.Where(j => j.LitProcessId == "ABC002512")
.SelectMany(j => j.LitEditJobTasks)
.OrderBy(t => t.LitNumber)
.Skip(10)
.Take(10)
.ToListAsync(cancellationToken);
Но это возвращает данные только LitEditJobTasks, но не другой таблицы
ОТРЕДАКТИРОВАНО:

Код: Выделить всё

var bulkEditJob = await context.BulkEditJob
.Include(x => x.BulkEdit)
.FirstAsync(x => x.JobId == bulkEditJobId);

await context.Entry(bulkEditJob)
.Collection(b => b.BulkEditJobTasks)
.Query()
.Where(x =>x.Status == BulkEditStatus.Pending)
.Skip(10)
.Take(10)
.LoadAsync();
Загрузка первой части запроса по-прежнему занимает 5–6 секунд, затем экспликационная часть выполняется быстро

Подробнее здесь: https://stackoverflow.com/questions/798 ... ptimized-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»