Включение не работает должным образом на EF Core 3.0 - PullRequest
0 голосов
/ 25 октября 2019

Я перенес веб-приложение ASP.NET Core 2.2 MVC в .NET Core 3.0. В некоторых случаях include не работает успешно.

var forms = _context.CheckInOutForm
    .Include(x => x.Employee)
    .AsQueryable();

// apply filter and sorting
forms = FilterForms(forms);
forms = SortForms(forms, sort);

// convert to viewmodel (database model as parameter in the constructer)
var items = forms.Select(x => new CheckInOutViewModel(x));

// load data for current page (with X.PagedList nuget package)
var pagedList = items.ToPagedList(pageNumber, pageSize);

По какой-то причине EF создает запрос для таблицы CheckInOutForm с внутренним объединением с Employee, но выбирает только поля из таблицы CheckInOutForm. Я перехватил сгенерированный запрос с помощью профилировщика SQL и проанализировал его.

Этот код работал до миграции. Я читал, что EF Core 3.0 изменил поведение объединения таблиц. Я до сих пор не понимаю, почему он создает выборку с полями только одной таблицы.

items.ToPagedList создает выбор с помощью OFFSET и FETCH NEXT. Эта же библиотека работает и на других страницах этого же приложения.

Любые советы или идеи?

1 Ответ

1 голос
/ 25 октября 2019

.Include никогда не работал с .Select. Но вы могли получить частичное выполнение на стороне клиента в EF Core 2, где ваш .Include работает на стороне сервера, а ваш .Select работает на стороне клиента.

В EF Core 3 вы всегда выполняете запросы на стороне сервера, поэтому ваш .Select будет подавлять .Include.

So (при условии FilterForms и SortForms don 'не делать ничего странного с запросом) вам просто нужно выполнить запрос перед проекцией в ViewModel. EG

var items = forms.ToPagedList(pageNumber, pageSize).Select(x => new CheckInOutViewModel(x));
...