数据未按日期排序

时间:2010-05-19 11:30:35

标签: .net xml linq linq-to-xml

无法按日期排序列表。如何显示按日期排序的数据?

XDocument doc = XDocument.Load(Server.MapPath("file.xml"));
IEnumerable<XElement> items = from item in doc.Descendants("item")
                                      orderby Convert.ToDateTime(item.Attribute("lastChanges").Value) descending
                                      where item.Attribute("x").Value == 1
                                      select item;

        Repeater1.DataSource = items;
        Repeater1.DataBind();

Xml文件如下所示:

<root>
  <items>
    <item id="1" lastChanges="15-05-2010" x="0" />
    <item id="2" lastChanges="16-05-2010" x="1" />
    <item id="3" lastChanges="17-05-2010" x="1" />
  </items>
</root>

2 个答案:

答案 0 :(得分:1)

我必须进行一些更改才能根据需要编译和排序示例代码:

var formatter = new DateTimeFormatInfo
    {
        ShortDatePattern = "dd/MM/yyyy"
    };
var items = from item in doc.Descendants("item")
            orderby Convert.ToDateTime(item.Attribute("lastChanges").Value, formatter) descending
            where item.Attribute("x").Value == "1"
            select item;

主要是提供一个IFormatProvider,以便系统可以正确解析日期。

输出:

<item id="3" lastChanges="17-05-2010" x="1" />
<item id="2" lastChanges="16-05-2010" x="1" />

如果您将过滤和排序数据的问题分开到可测试的类中,您应该能够验证排序是否正常工作并将问题搜索集中在其他地方。

public class DataSource
{
    private readonly XDocument _doc;

    public DataSource(XDocument doc)
    {
        _doc = doc;
    }

    public IEnumerable<XElement> GetSortedFilteredElements()
    {
        var formatter = new DateTimeFormatInfo
            {
                ShortDatePattern = "dd/MM/yyyy"
            };
        var items = from item in _doc.Descendants("item")
                    orderby Convert.ToDateTime(item.Attribute("lastChanges").Value, formatter) descending
                    where item.Attribute("x").Value == "1"
                    select item;
        return items;
    }
}

用法:

Repeater1.DataSource =
  new DataSource(XDocument.Load(Server.MapPath("file.xml")))
    .GetSortedFilteredElements();

接下来要看的是,正如@ david-b所建议的那样,Repeater是否重新排序输入,因为如果按字符串排序,字符串化的XmlNode值肯定会以不同的顺序出现。

答案 1 :(得分:0)

Repeater1.DataBind(); 

也许您的UI控件已将订单设置为其他内容?