次の構造の 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 ごとに最新の 2 つの日付を取り出す必要があります。
これが 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 について、最新の 2 つの日付を掘り下げる必要があります。
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) を使用すると、ID ごとに上位 2 行ではなく、上位 2 行のデータのみが取得されます。
では、上記の LINQ の SQL ステートメントに相当するものを誰か教えてもらえますか? 私は C# でループと条件を使用して XML を解析および管理したくありません。また、LINQ はまったく初めてで (昨日読んで使い始めました)、まだドキュメントを読んでいます。