我已将列表字段添加到我的业务模型中。它尚未存储在数据库中,我希望用如下所示的内容临时映射它:
return MyContext.Foos.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new List<string>()
}).ToList();
但是,实体框架抱怨它无法在 LINQ to Entities 查询中实例化新列表:
无法在 LINQ to Entities 查询中初始化实现 IEnumerable 'System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' 的类型。
基本上,List<string>
是一个复杂类型,虽然它包含默认构造函数,但构造函数需要在使用列表之前运行一些初始化代码。实体框架只是不理解如何从 SQL 方面生成空列表。
我还尝试使用空数组达到相同的结果:
return MyContext.Foos
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new string[0]
}).ToList();
LINQ to Entities 不支持 LINQ 表达式节点类型“NewArrayBounds”。
同样,实体框架不支持该表达式,尽管它要简单得多。所以我尝试了最简单的表达式,对于一个新数组:
return MyContext.Foos
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = { }
}).ToList();
在构造函数和初始值设定项中,LINQ to Entities 仅支持属性或字段参数绑定。
我知道一种替代方法是先将所有对象加载到内存中,然后通过 C# 初始化列表:
return MyContext.Foos.ToList()
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new List<string>()
}).ToList();
然而,这似乎是一种解决方法,而不是实际的解决方案。如果我不想重新迭代集合,如何初始化列表?