2009-07-01 83 views
4

我通過發送where子句不如授人以一個自定義的方法獲取數據了一個XML文件:如何將OrderBy添加到此LINQ語句中?

foreach (PageItem pageItem in GetPageItems(xmlDoc, sf => (int)sf.Element("id") == id)) 
{ 
    _collection.Add(pageItem); 
} 

的正常工作,但現在我想補充一個排序依據條款爲好,但可「T得到正確的語法,這不承認‘pageItem’的排序依據子句中,等

我怎樣才能獲得排序依據在下面的代碼工作?

public IEnumerable<PageItem> GetPageItems(XDocument xmlDoc, Func<XElement, bool> whereClause) 
{ 
    var pageItems = xmlDoc.Descendants("pageItem") 
     .Where(whereClause) 
     .OrderBy((int)pageItem.Element("displayOrder").Value) 
     .Select(pageItem => new PageItem 
     { 
      Id = (int)pageItem.Element("id"), 
      WhenCreated = (DateTime)pageItem.Element("whenCreated"), 
      ItemOwner = pageItem.Element("itemOwner").Value, 
      PublishStatus = pageItem.Element("publishStatus").Value, 
      CorrectionOfId = (int)pageItem.Element("correctionOfId"), 

      IdCode = pageItem.Element("idCode").Value, 
      Menu = pageItem.Element("menu").Value, 
      Title = pageItem.Element("title").Value, 
      Description = pageItem.Element("description").Value, 
      AccessGroups = pageItem.Element("accessGroups").Value, 
      DisplayOrder = (int)pageItem.Element("displayOrder") 


     }); 
    return pageItems; 
} 

回答

7

您是否嘗試將OrderBy移動到選擇並使用PageItem對象的屬性來排序而不是XML元素之後?

// Move this to after the select... 
.OrderBy(pi => pi.DisplayOrder); 
3

我懷疑你可能要更改線路是:

.OrderBy(p => (int)p.Element("displayOrder").Value) 

的排序依據()擴展預計可用於提取密鑰的「密鑰選擇」委託(Func鍵)從你想要訂購的物品。

+0

完美,不得不將其更改爲這一點,但它的工作:.OrderBy(P => Int32.Parse(p.Element( 「displayOrder」)值)。) – 2009-07-01 14:42:27

+0

它應該切出。值而不是修改它以使用Int32.Parse。 – 2009-07-01 14:45:37