如何将OrderBy添加到此LINQ语句中?

时间:2009-07-01 14:27:32

标签: c# linq linq-to-xml

我通过将where子句作为委托发送到自定义方法来从XML文件中获取数据:

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

工作正常,但现在我想添加 OrderBy 子句,但无法获得正确的语法,此处无法识别“pageItem”在OrderBy子句等中

如何在下面的代码中使用OrderBy?

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;
}

2 个答案:

答案 0 :(得分:7)

您是否尝试将OrderBy移动到Select之后并使用PageItem对象的属性来命令而不是XML元素?

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

答案 1 :(得分:3)

我怀疑您可能希望将该行更改为:

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

OrderBy()扩展需要一个“键选择器”委托(Func),它可用于从您想要订购的项目中提取密钥。