gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:16:25 27 4
gpt4 key购买 nike

我已将列表字段添加到我的业务模型中。它还没有存储在数据库中,我希望用类似下面的东西临时映射它:

return MyContext.Foos.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new List<string>()
}).ToList();

但是, Entity Framework 提示它无法在 LINQ to Entities 查询中实例化新列表:

A type that implements IEnumerable 'System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' cannot be initialized in a LINQ to Entities query.

基本上,List<string>是一个复杂类型,虽然它包含一个默认构造函数,但构造函数需要在列表可以使用之前运行一些初始化代码。 Entity Framework 只是不理解如何从 SQL 方面生成一个空列表。

我也尝试用空数组实现相同的结果:

return MyContext.Foos
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new string[0]
}).ToList();

The LINQ expression node type 'NewArrayBounds' is not supported in LINQ to Entities.

同样, Entity Framework 不支持该表达式,即使它更简单。所以我尝试了所有表达式中最简单的一个新数组:

return MyContext.Foos
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = { }
}).ToList();

In constructors and initializers, only property or field parameter bindings are supported in LINQ to Entities.

我知道一种替代方法是先将所有对象加载到内存中,然后通过 C# 初始化列表:

return MyContext.Foos.ToList()
.Select(foo=> new Foo
{
Id = foo.Id,
Name = foo.Name,
RequiredFeatures = new List<string>()
}).ToList();

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

最佳答案

令人惊讶的是,尽管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();

但是,这确实有一个警告,即您不能将项目添加到列表中,因为它是由一个数组支持的,而不是一个实际的列表。它们在功能上看起来都相同,我不确定为什么 Entity Framework 支持其中一些而不支持其他。

空集合

支持:

  • 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 支持带值的列表,但不支持空列表。

关于c# - 如何在 Entity Framework 查询中初始化一个空列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49185509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com