Ошибка при создании запроса Linq

У меня есть запрос вроде этого

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 для сущностей поддерживаются только конструкторы и инициализаторы без параметров".}

но если я изменил тип MyStruct на класс, тогда он работает как ожидалось.

Почему он работает с классом и не работает с struct?

Ответы

Ответ 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
    };

Ответ 2

Linq для объектов не поддерживает проектирование в структуры. Им было бы необходимо разработать поддержку для этого в поставщике запросов, и они просто не хотят этого делать. Похоже, что они не рассматривали его как достаточно ценную функцию для поддержки того, чтобы она стоила затрат на разработку.

Вам нужно будет спроектировать в новые экземпляры класса в ваших запросах.

Ответ 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 };