【发布时间】:2018-03-09 10:02:44
【问题描述】:
我在我的业务模型中添加了一个列表字段。它尚未存储在数据库中,我希望将其临时映射为以下内容:
return MyContext.Foos.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new List<string>()
}).ToList();
但是,Entity Framework 抱怨它无法在 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> 是一个复杂类型,虽然它包含一个默认构造函数,但构造函数需要运行一些初始化代码才能使用列表。 Entity Framework 只是不明白如何从 SQL 方面生成一个空列表。
我也尝试使用空数组来实现相同的结果:
return MyContext.Foos
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new string[0]
}).ToList();
LINQ to Entities 不支持 LINQ 表达式节点类型“NewArrayBounds”。
同样,Entity Framework 不支持该表达式,尽管它更简单。所以我尝试了最简单的表达式,用于一个新数组:
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();
但是,这似乎是一种解决方法,而不是实际的解决方案。如果我不想重新遍历集合,如何初始化列表?
【问题讨论】:
标签: c# entity-framework entity-framework-6