【问题标题】:How do I initialize an empty list within an Entity Framework query?如何在实体框架查询中初始化一个空列表?
【发布时间】: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&lt;string&gt; 是一个复杂类型,虽然它包含一个默认构造函数,但构造函数需要运行一些初始化代码才能使用列表。 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


    【解决方案1】:

    令人惊讶的是,虽然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&lt;string&gt;()
    • new List&lt;string&gt; { }
    • new List&lt;string&gt;() { }

    非空集合

    支持:

    • new [] { "foo" }
    • new string[] { "foo" }
    • new string[1] { "foo" }
    • new List&lt;string&gt; { "foo" }
    • new List&lt;string&gt;() { "foo" }

    不支持:

    • { "foo" }

    有趣的是,Entity Framework 支持带值的列表,但不支持空列表。

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多