LINQ select 创建新对象时返回 NULL

LINQ select returning NULL when creating a new object

我正在使用 LINQ return 新对象中的结果列表。

最终结果应该是:

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)));

我已经测试了下面的内容,它整齐地return是一个名字列表。

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

我在其他地方使用相同的 class,这里唯一的区别是使用 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 } ));

异常堆栈跟踪显示异常源自 EF Core 基础结构

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

这清楚地表明了 EF Core 错误。

请注意,使用构造函数的投影仅在客户端受支持,即仅当它是最终查询操作时,因此该错误很可能是由 EF Core 3.x 查询处理管道中的缺失案例引起的.

无论如何,你没有问具体问题,只是显示了一个问题和症状,所以你真的应该去 https://github.com/dotnet/efcore/issues 报告。

如果您正在寻找解决方法,我可以推荐以下两个。

如果您只需要 y,您可以将 Select 移到 SelectMany 之后,例如

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

如果您同时需要 xy,或者通常情况下,您可以将 Select 替换为带有结果选择器的 SelectMany 重载,例如

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