C# 在SQL中可以在分区上进行排名,在LINQ到xml中如何进行排名

C# 在SQL中可以在分区上进行排名,在LINQ到xml中如何进行排名,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我有一个结构如下的XML文件: 但我有XML格式的数据,我能想到的最好办法就是根据ID StartDate对数据进行排序。我仍然需要为每个身份证找出最近的两个日期 var CAF请求= from request in xdoc.Descendants("Request") orderby (int)request.Element("ID"), (DateTime)request.Element("Finance").Element("StartDate") ascending select

我有一个结构如下的XML文件:

但我有XML格式的数据,我能想到的最好办法就是根据ID StartDate对数据进行排序。我仍然需要为每个身份证找出最近的两个日期

var CAF请求=

from request in xdoc.Descendants("Request")
orderby (int)request.Element("ID"), 
(DateTime)request.Element("Finance").Element("StartDate") ascending
select new
{
    ID = request.Element("ID"),
    StartDate = request.Element("Finance").Element("StartDate"),
};
使用Take(2)只能获取前2行数据,而不是每个ID的前2行


那么,有谁能告诉我,在LINQ中,上述SQL语句的等价物是什么?我不想在C#中使用循环和条件来解析和管理XML,我对LINQ很陌生(昨天读过并开始使用它),我还在浏览文档。

我们不能按Id分组并选择最近的日期吗?像这样的。如果您在结果集中获得ID列表和相应日期(CAF请求)


这将为您提供每个Id的前2个日期。

这很有效,我测试了它:

        XDocument doc = XDocument.Load(@"Data.xml");

        var result2 = doc.Element("Entities")
            .Elements("Request")
            .GroupBy(key => key.Element("ID").Value, el => DateTime.Parse(el.Element("Finance").Element("StartDate").Value))
            .Select(el =>
                new
                {
                    id = el.Key,
                    max2 = el.OrderByDescending(date => date).Take(2)
                });
  • doc.Element(“Entities”)
    -获取名为Entity的元素,该元素是文档的根元素,另一种检索此元素的方法是
    doc.root
  • 元素(“请求”)
    -获取名为Request的元素,这些元素是实体的子元素
  • GroupBy
    -是一种类似于SQL中的
    GroupBy
    的方法,第一个参数是将用于分组的元素,它是请求元素的子元素,第二个参数是从StartDate元素解析
    DateTime
    的元素选择器函数(是财务元素的子元素,是请求元素的子元素)
  • 。选择(el=>new…
    ——创建匿名类型的方法,该类型保存ID和2条ID日期最高的记录
下面是一个获得相同结果的查询,但使用查询语法编写(上面的示例是方法语法):


虽然我不完全理解这段代码,但它确实有效。谢谢:)不客气,我很乐意帮忙。我添加了一些解释和一个用查询语法编写的示例,也许它澄清了查询中发生的事情:)
from request in xdoc.Descendants("Request")
orderby (int)request.Element("ID"), 
(DateTime)request.Element("Finance").Element("StartDate") ascending
select new
{
    ID = request.Element("ID"),
    StartDate = request.Element("Finance").Element("StartDate"),
};
var result = cafrequests.GroupBy(x=>x.Id).Select(x=>new{ x.Key,Dates = x.OrderByDescending(y => y.StartDate).Select(y=>y.StartDate).Take(2)}).ToDictionary(x=>x.Key);
        XDocument doc = XDocument.Load(@"Data.xml");

        var result2 = doc.Element("Entities")
            .Elements("Request")
            .GroupBy(key => key.Element("ID").Value, el => DateTime.Parse(el.Element("Finance").Element("StartDate").Value))
            .Select(el =>
                new
                {
                    id = el.Key,
                    max2 = el.OrderByDescending(date => date).Take(2)
                });
        var result = from el in doc.Root.Elements("Request")
                     group DateTime.Parse(el.Element("Finance").Element("StartDate").Value) by el.Element("ID").Value into grouped
                     select new { 
                         id = grouped.Key,
                         max2 = (from el in grouped
                                 orderby el descending
                                 select el)
                                 .Take(2)
                     };