And*_*son 2 c# entity-framework entity-framework-6
我已经将列表字段添加到我的业务模型中。它尚未存储在数据库中,我希望使用以下类似内容暂时将其映射:
return MyContext.Foos.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new List<string>()
}).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,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>是一种复杂类型,尽管它包含默认构造函数,但该构造函数要求先运行一些初始化代码,然后才能使用列表。实体框架只是不了解如何从SQL方面生成空列表。
我还尝试使用空数组实现相同的结果:
return MyContext.Foos
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new string[0]
}).ToList();
Run Code Online (Sandbox Code Playgroud)
LINQ to Entities不支持LINQ表达式节点类型'NewArrayBounds'。
同样,即使实体表达式简单得多,实体框架也不支持该表达式。因此,我尝试了所有数组中最简单的表达式:
return MyContext.Foos
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = { }
}).ToList();
Run Code Online (Sandbox Code Playgroud)
在构造函数和初始化程序中,LINQ to Entities仅支持属性或字段参数绑定。
我知道一种替代方法是先将所有对象加载到内存中,然后通过C#初始化列表:
return MyContext.Foos.ToList()
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new List<string>()
}).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,这似乎是一种解决方法,而不是实际的解决方案。如果我不想在集合上重复,如何初始化列表?
出人意料的是,尽管new string[0]并{ }不能正常工作,new string[] { }并且可以new string[0] { }做到!
return MyContext.Foos.ToList()
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new string[] { }
}).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,这确实有一个警告:您不能向列表中添加项目,因为它由数组(而不是实际列表)支持。它们在功能上似乎都相同,我不确定为什么实体框架支持某些而不支持其他。
支持的:
new string[] { }new string[0] { }不支持:
{ }new string[0]new List<string>()new List<string> { }new List<string>() { }支持的:
new [] { "foo" }new string[] { "foo" }new string[1] { "foo" }new List<string> { "foo" }new List<string>() { "foo" }不支持:
{ "foo" }有趣的是,Entity Framework支持带有值的列表,但不包含空列表。
| 归档时间: |
|
| 查看次数: |
1648 次 |
| 最近记录: |