Что делает “… конструкторы без параметров, и инициализаторы поддерживаются …” средняя ошибка?

Я получаю эту ошибку:

Only parameterless constructors and initializers are supported in LINQ to Entities.

При попытке выполнить этот код (нашел этот код здесь и сделал тестовую базу данных для проигрывания вокруг с):

XElement xml = new XElement("contacts",
                    from c in db.Contacts
                    orderby c.ContactId
                    select new XElement("contact",
                              new XAttribute("contactId", c.ContactId),
                              new XElement("firstName", c.FirstName),
                              new XElement("lastName", c.LastName))
                    );

где дб является автоматическим созданным объектом объектов. Какие-либо идеи о том, как заставить это работать?

7
задан Evan 12 August 2010 в 01:13
поделиться

2 ответа

Я считаю, что это возражает против того факта, что вы используете конструктор XElement, который принимает параметры в вашем предложении «select». Поскольку XElement не имеет конструктора без параметров, вам может потребоваться изменить код, чтобы выбрать анонимный тип, и после этого инициализировать коллекцию XElement.

var els = from c in db.Contacts
          orderby c.ContactID
          select new { c.ContactID, c.FirstName, c.LastName };

var xml = new XElement("contacts",
    els.ToList()
       .Select(e => new XElement("contact", 
                        new XAttribute("contactID", e.ContactID),
                        new XElement("firstName", e.FirstName),
                        new XElement("lastName", e.LastName))));

Это не проверено, но, надеюсь, дает вам представление. Сначала я выполняю запрос EF, а затем вызываю для него ToList (), чтобы я мог выбрать коллекцию XElement, используя Linq to Objects, а не EF.

6
ответ дан 7 December 2019 в 07:38
поделиться

Я бы переписал это так:

XElement xml2 = new XElement("contacts", 
                    from c in
                    ((IEnumerable<Contact>)(from c in Contacts
                    orderby c.ContactId
                    select c))
                select new XElement("contact", 
                      new XAttribute("contactId", c.ContactId),
                      new XElement("firstName", c.FirstName),
                      new XElement("lastName", c.LastName))
            );

Дело в том, чтобы отделить дерево выполнения LINQ от экземпляра XElement. Приведя запрос LINQ из IQueriable в IEnumerable, вы разделите код, который LINQ будет использовать для получения данных из кода, который будет создавать ваши XElements.

1
ответ дан 7 December 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: