【问题标题】:Error creating a Linq query创建 Linq 查询时出错
【发布时间】:2013-04-10 17:18:22
【问题描述】:

我有一个这样的查询

struct MyStruct
{
  public string name;
  public double amount;
}

var a =
  from p in Products
  select new MyStruct
  {
    name = p.Name,
    amount = p.Amount
  };

当我执行查询时,我得到以下异常:

System.NotSupportedException {“LINQ to Entities 中仅支持无参数构造函数和初始化程序。”}

但如果我将 MyStruct 的类型更改为 class,那么它会按预期工作。

为什么它与 class 一起工作而与 struct 一起失败?

【问题讨论】:

    标签: c# .net linq entity-framework linq-to-objects


    【解决方案1】:

    它适用于 LinqToObjects。我猜 LinqToEntities 不知道如何创建一个结构。如果你这样做,你会没事的:

    struct MyStruct
    {
      public string name;
      public double amount;
    }
    
    var a = Products.AsEnumerable()
        .Select(p => new MyStruct
        {
            name = p.Name,
            amount = p.Amount
        };
    

    【讨论】:

    • 但是您并没有将查询限制在指定的字段中,这是开始选择的关键点之一。
    • 如果您担心不从数据库中提取无关数据,您可以在两者之间创建一个匿名类。我不明白他为什么要使用结构。
    • 我认为他对“为什么”更感兴趣,然后是“我该如何解决”。
    • 看起来他试图避免创建所有这些类实例的开销,而是使用结构。正如他所说,使用一个类(它是否是匿名的都没有关系)可以正常工作,但结构却不行。
    • @Shlomo 是的,我发布了这个问题以了解为什么它不适用于 struct。我使用 class 修复了它,是的,我需要自定义类型,因为查询将由使用自定义类型作为返回类型的方法返回:IList
    【解决方案2】:

    Linq to entity 不支持投影到结构中。他们需要在查询提供程序中设计对此的支持,而他们只是选择不这样做。看起来他们并不认为它是一个足够有价值的功能来支持它以值得开发成本。

    您需要在查询中投影到新的 class 实例。

    【讨论】:

    • > Linq to entity 不支持投影到结构中
    【解决方案3】:

    试试这个:

    struct MyStruct
    {
                public string name;
                public double amount;
    }
    
    Products[] p1 = new Products[] { new Products { name = "prod1", amount = 5 }
    var c = from p in p1
            select new MyStruct { name = p.name, amount = p.amount };
    

    【讨论】:

    • 他没有对对象进行 Linq,他使用的是查询提供程序,而查询提供程序在解释这一点时遇到了麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多