Я получаю эту ошибку:
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))
);
где дб является автоматическим созданным объектом объектов. Какие-либо идеи о том, как заставить это работать?
Я считаю, что это возражает против того факта, что вы используете конструктор 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.
Я бы переписал это так:
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.