Анонимные проекции Entity Framework Core 3.1 теперь нельзя использовать в операторах Linq include? - PullRequest
0 голосов
/ 05 марта 2020

Итак, я использую Entity Framework начиная с версии 4, и недавно в проекте, который я делал, произошли серьезные изменения. Достаточно сказать, что я использую EF для получения разницы от одной базы данных к другой в процессе ETL с EF core 3.1.2, который был EF Core 2.2.6. Часть, которая сейчас ломается, имеет код, подобный следующему.

var setOne = await 1stContext.table.Where(x => x.DateModified >= inputDate)).Select(x => new { x.UserId, x.RoleId, x.UniversityId }).ToListAsync();

var toRemove = 2ndContext.table.Where(x => setOne.Contains(new { x.UserId, x.RoleId, x.UniversityId })).ToList();

Имеет анонимную проекцию 'new {(items)}', которая используется, но теперь она взрывается. Я попытался привести к именованному кортежу, который был новым с C# 7, но вы не можете сделать это в дереве выражений в соответствии с компилятором. Так есть идеи по-новому? Может быть, просто сделать linq join или подобное? Моя идея всегда заключалась в том, чтобы сначала выполнить условие where, прежде чем реализовывать данные, чтобы эквивалент sql не давал мне все результаты, а затем go над ними.

ОБНОВЛЕНИЕ Вот простой экран печати без ef о чем я Я делал это все время с очень широкими наборами, которые я хотел сделать только меньший набор, а затем найти его. Я мог бы сделать соединение, но ключ в том, что если вы посмотрите на мое второе утверждение, я еще не проецирую на реальный объект с 'toList', и если бы я это сделал, я потерял бы способность получить объекты, которые я хотел удалить потенциально. Я мог бы сделать соединение, но я просто не хочу делать дорогие звонки в базу данных, чтобы получить все и затем фильтр. Но соединение может работать. Я, вероятно, поиграю с этим завтра на работе, но просто хотел, чтобы это было здесь, если бы кто-нибудь знал.

enter image description here

1 Ответ

0 голосов
/ 10 марта 2020

Исходя из того, что сказал Иван Стоев, я просто поместил «AsEnumerable» после объявления объекта и перед «где». Кажется, что EF Core 3.1 намного более строг, чем предыдущие итерации.

Итак, это:

2ndContext.table.Where

стало таким:

2ndContext.table.AsEnumerable().Where

Просто в сущности прямо заявляя, что из того, что я получаю от других, это подразумевало моего клиента ранее.

...