如何在Entity Framework查询中初始化一个空列表?

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)

但是,这似乎是一种解决方法,而不是实际的解决方案。如果我不想在集合上重复,如何初始化列表?

And*_*son 6

出人意料的是,尽管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支持带有值的列表,但不包含空列表。