2012-02-13 259 views
3

在混合LINQ到SQL和LINQ到XML,我曾經是能夠做這樣的事情:從Linq-to-Entities中選擇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))); 

這是我唯一的選擇,現在,還是有其他的代碼來表達這種更清潔的方式?

回答

3

該方法是正確的。要稍微縮短它,您可以直接在對象上使用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))); 
+0

在表中創建一個行的列表會在這裏過大,因爲這個列表從來沒有真正用於枚舉之外。 – 2012-02-13 18:42:59

+0

@JeffMercado正確。 ToList在這種情況下是過分的,因爲查詢在Add中被消耗,並且不需要考慮順從。 – 2012-02-13 19:58:43

6

當你做投影時使用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)));