Привязка данных с Linq - неожиданное поведение - PullRequest
0 голосов
/ 19 июня 2020

Всем привет и спасибо за вашу помощь.

У меня большие трудности с обновлением данных DataBinding с помощью Linq. Я много читал и действительно не нашел решения. Я использую следующий код:

private void MontaGrid()
{
    var ini = DateTime.Parse(dtIni.EditValue.ToString()).Date;
    var fim = DateTime.Parse(dtFim.EditValue.ToString()).Date.AddDays(1);

    _ctx.programacao.Where(c => c.data >= ini && c.data < fim)
                                                          .OrderBy(c => c.data)
                                                          .ThenBy(c => c.id_programacao)
                                                          .Load();

    programacaoBindingSource.DataSource = _ctx.programacao.Local.ToBindingList();
}

Идея состоит в том, чтобы загрузить отфильтрованные данные, передавая только те, которые представляют интерес для BindingSource.

Итак, при загрузке с помощью Load () и назначьте данные, которые уже находятся на машине, в BindingSource с помощью .Local.ToBindingList ().

Загрузка первой консультации происходит нормально. Однако, когда я меняю дату и повторяю команду, данные из предыдущего запроса не исчезают, а накапливаются. Если я повторяю более крупный запрос даже в период, он приносит больше данных и отображает. Если я сокращу период, данные не исчезнут, они останутся там.

Чтобы быть уверенным, что SELECT генерируется Linq, я проверил выполнение вызова в профилировщике XEvent Management Studio SQL Сервер и заметил, что сгенерированный код правильный.

Я протестировал нагрузку BindingSource на разных компонентах, и все они представляют одну и ту же ситуацию, что заставляет меня думать, что проблема в BindingSource.

Я попытался избежать .Local () и использовал другой подход (код ниже), но с .ToList () я не могу включать новые записи: когда я использую его и применяю context.SaveChanges (), я не получаю сообщение об ошибке и новая запись не сохранена.

programacaoBindingSource.DataSource = _ctx.programacao.Where(c => c.data >= ini && c.data < fim)
                                                                  .OrderBy(c => c.data)
                                                                  .ThenBy(c => c.id_programacao)
                                                                  .ToList();

Я всегда работал со всеми CRUD вручную с помощью EF + Linq, но это большая работа, и теперь я пытаюсь перейти на BindingSource, чтобы автоматизировать эти задачи и из-за моей неопытности я испытываю трудности в этом вопросе.

Пожалуйста, не могли бы вы помочь мне?

...