LINQ select возвращает NULL при создании нового объекта - PullRequest
1 голос
/ 27 марта 2020

Я использую LINQ для возврата списка результатов в новом объекте.

Конечный результат должен быть таким:

var test = context.Playarea
            .Include(x => x.Cats)
            .Where(x => x.Cats.Any())
            .SelectMany(x => x.Cats.Select(y => new MyClass(x.Id, y.Name)));

Я проверил нижеприведенное, и он аккуратно возвращает список имен.

var test = context.Playarea
            .Include(x => x.Cats)
            .Where(x => x.Cats.Any())
            .SelectMany(x => x.Cats.Select(y => y.Name));

Если я пытаюсь преобразовать его в очень простой объект, но получаю исключение NULL?

public class MyClass
{
    public MyClass(string name)
    {
        Name = name;
     }

    public string Name { get; set; }
}


var test = context.Playarea
            .Include(x => x.Cats)
            .Where(x => x.Cats.Any())
            .SelectMany(x => x.Cats.Select(y => new MyClass(y.Name)));

Нет ничего, что может быть NULL, поэтому я не могу Не понимаю, как это получается?

GetEnumerator(): Exception of type 'System.NullReferenceException' was thrown

Я использую тот же класс в другом месте, единственное отличие здесь заключается в использовании SelectMany ().

Анонимные объекты также работают нормально:

var test = context.Playarea
                .Include(x => x.Cats)
                .Where(x => x.Cats.Any())
                .SelectMany(x => x.Cats.Select(y => new { Id = x.Id, Name = y.Name } ));

1 Ответ

1 голос
/ 28 марта 2020

Трассировка стека исключений показывает, что исключение происходит из инфраструктуры EF Core

at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.MemberAccessShiftingExpressionVisitor.VisitExtension(Expression node)

, что явно указывает на ошибку EF Core.

Обратите внимание, что проекция с использованием конструкторов поддерживается только на стороне клиента, т.е. только когда это последняя операция запроса, поэтому, скорее всего, ошибка вызвана отсутствующим регистром в конвейере обработки запросов EF Core 3.x.

В любом случае, вы не задали конкретный вопрос, просто показали проблема и симптомы, поэтому вам действительно нужно go и сообщить об этом по номеру https://github.com/dotnet/efcore/issues.

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

Если вам нужно только y, вы можете переместить Select после SelectMany, например,

.SelectMany(x => x.Cats).Select(y => new MyClass(y.Name));

Если вам нужны оба x и y, или вообще, вы можете заменить Select перегрузкой SelectMany с помощью селектора результатов, например

.SelectMany(x => x.Cats, (x, y) => new MyClass(x.Id, y.Name))
...