C# Линк один ко многим запрос EF Core - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть таблица элементов флажков и таблица, в которой хранятся выбранные пользователями элементы флажков. Разветвленная модель в основном похожа на это в EF

CheckboxItem Свойства модели:

public CheckboxItem()
{
    SelectedCheckboxItems = new HashSet<SelectedCheckboxItems>
}

public int Id { get; set; }
public virtual ICollection<SelectedCheckboxItems> SelectedCheckboxItems { get; set; }

SelectedCheckboxItems Свойства модели:

public int Id { get; set; }
public virtual Checkbox Checkbox { get; set; }

Я пытаюсь захватить все доступные элементы-флажки вместе с соответствующими выбранными элементами-флажками и вставьте их в модель представления, которую я буду использовать позже, чтобы заполнить представление правильными флажками / предварительно выбрать их выбранные варианты.

У меня есть пока что рабочее решение, но запрос медленный, его выполнение занимает около 4-5 секунд:

 var testSub = _context.CheckboxItem.Include(a => a.SelectedCheckboxItems).Where(a => a...// filters)
                .Select(a => new ViewModel
            {
                CheckboxItemId = a.Id,
                Checked = a.SelectedCheckboxItems.Where(x => x.userId.Equals(userId) && x.Id == a.Id).Select(z => z.Checked == true).FirstOrDefault()
            }).AsNoTracking().ToList();

Конечная цель - просто вернуть список объектов ViewModel со всеми доступными элементами-флажками и был ли этот элемент выбран пользователем или нет.

Какие-либо советы о том, как улучшить это или каким-либо образом оптимизировать его, чтобы он был намного быстрее? На самом деле в таблице только 15 доступных элементов-флажков, поэтому для этого запроса он выглядит просто медлительно sh, чтобы завершить sh за 4-5 секунд.

1 Ответ

0 голосов
/ 06 февраля 2020

Измените ToList () на AsQueryable (). ToList () приводит к снижению производительности.

Как насчет этого?

var selectedlist = db.SelectedCheckboxItems;
    var testSub = _context.CheckboxItem.Where(a => a...// filters)
    .Select(a => new ViewModel {
                CheckboxItemId = a.Id,
                Checked = selectedlist.Where(x => x.userId.Equals(userId) && x.Id == a.Id).Select(z => z.Checked == true).FirstOrDefault()
            }).AsNoTracking().AsQueryable();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...