gpt4 book ai didi

c# - 可以在 SQL 中对分区进行排名,在 LINQ to xml 中如何做

转载 作者:行者123 更新时间:2023-11-30 12:12:15 27 4
gpt4 key购买 nike

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

<Entities>
<Request>
<ID> A1 </ID> <!-- Can be multiple records with same values -->
<Finance>
<StartDate> Some Date </StartDate> <!-- Unique per ID -->
</Finance>
<Request>
<Request> ... </Request>
</Entities>

可以有多个具有相同 ID 的请求,但在这种情况下,每个请求的 StartDate 需要不同。

我需要为每个 ID 取出最近的两个日期。

如果这是一个包含 ID 和 StartDate 列的 SQL 表,我会使用以下运行良好的查询:

SELECT ID, StartDate 
FROM ( SELECT ID, StartDate, RANK()
OVER (PARTITION BY ID ORDER BY StartDate DESC) rank
FROM Request )
WHERE rank IN ('1','2')

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

var cafrequests =

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 行。

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

最佳答案

这行得通,我测试过:

        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
  • Elements("Request") - 获取名为 Request 的元素,这些元素是 Entity 的子元素
  • GroupBy - 是一种有点类似于 SQL 中的 GROUP BY 的方法,第一个参数是要用于分组的元素,它是 Request 的子元素元素,第二个参数是一个元素选择器函数,它从 StartDate 元素(它是 Finance 元素的子元素,是 Request 元素的子元素)解析 DateTime
  • .Select(el => new...) - 创建匿名类型的方法,该类型包含 ID 和 2 个具有最高 ID 日期的记录

这是一个获得相同结果的查询,但是用查询语法编写(上面的示例是方法语法):

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

关于c# - 可以在 SQL 中对分区进行排名,在 LINQ to xml 中如何做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13947773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com