【发布时间】:2020-03-28 23:10:19
【问题描述】:
我正在使用 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 } ));
【问题讨论】:
-
SelectMany永远不会返回null,但是您如何观察结果?由于延迟执行,调试器在显示准确结果方面是出了名的差。 -
我在 JetBrains Rider 中使用断点。我的代码返回一个有效的字符串列表,但它无法处理创建一个新的 MyClass。
-
我会使用
ToList()创建一个实际的集合来查看结果。这将比调试器更明确。 -
我尝试在我的测试中使用 ToList() 并且它确实创建了一个字符串列表。如果我在尝试创建类时这样做,我只会收到 500 错误。
-
必须是我们看不到代码的实体类之一。旁注:您可以删除
Include。
标签: linq asp.net-core-3.0