我有一个具有以下结构的 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 行。
那么任何人都可以告诉我 LINQ 中上述 SQL 语句的等价物是什么吗?我不想在 C# 中使用循环和条件来解析和管理 XML,而且我对 LINQ 还是很陌生(昨天阅读并开始使用它),我仍在阅读文档。