Выберите Linq-to-XML из Linq-to-Entities? - PullRequest
3 голосов
/ 13 февраля 2012

Смешивая Linq-to-SQL и Linq-to-XML, я имел обыкновение делать что-то вроде этого:

XElement xml = new XElement("People");

xml.Add(from p in Context.People
        select new XElement("Person",
            new XElement("Id", p.Id),
            new XElement("Name", p.Name)));

При преобразовании некоторых вещей в EF я теперь получаю следующее исключение: «В LINQ to Entities поддерживаются только конструкторы и инициализаторы без параметров».

Это наводит меня на мысль, что теперь мне нужно сделать что-то вроде этого:

XElement xml = new XElement("People");

var peopleResults = Context.People.Select(p => { p.Id, p.Name }).ToList();

xml.Add(from p in peopleResults
        select new XElement("Person",
            new XElement("Id", p.Id),
            new XElement("Name", p.Name)));

Это моя единственная альтернатива сейчас, или есть другой способ выразить это в коде?

Ответы [ 2 ]

6 голосов
/ 13 февраля 2012

Используйте LINQ to Objects при проецировании.Для этого просто позвоните AsEnumerable() заранее.

XElement xml = new XElement("People");

xml.Add(from p in peopleResults.AsEnumerable()
        select new XElement("Person",
            new XElement("Id", p.Id),
            new XElement("Name", p.Name)));
3 голосов
/ 13 февраля 2012

Подход правильный. Чтобы немного его укоротить, вы можете использовать метод ToList непосредственно для объекта.

XElement xml = new XElement("People");

xml.Add(from p in Context.People.ToList()
        select new XElement("Person",
            new XElement("Id", p.Id),
            new XElement("Name", p.Name)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...