LINQ를 이용한 XML의 검색방법 역시 기존의 LINQ와 동일하다.
특징적으로 이야기할 수 있는 사항은 각각의 XML의 element, attribute, comment 등으로 검색이 가능하다는 점으로, DB LINQ나 Object LINQ에서 사용하는 것과 같이 XML의 특성으로 검색이 가능하다.
조금 복잡한 LINQ query를 하나 예시로 든다면..
var biddata = from b in bids.Descendants("bid_tuple")
where double.Parse(b.Element("bid").Value) > 50
join u in users.Descendants("user_tuple")
on b.Element("userid").Value equals u.Element("userid").Value
join i in items.Descendants("item_tuple")
on b.Element("itemno").Value equals i.Element("itemno").Value
select new
{
Item = b.Element("itemno").Value,
Description = i.Element("description").Value,
User = u.Element("name").Value,
Date = b.Element("bid_date").Value,
Price = b.Element("bid").Value
};
foreach(var bd in biddata)
{
Console.WriteLine("{0, -12} {1, -12} {2, -6}, {3, -14}, {4:C, 10}", bd.Date, bd.User, bd.Item,
bd.Description, bd.Price);
}
보면 재미있는 내용중 하나가 select 구문에서의 새로운 Class의 생성이다. 이 Class는 따로 선언되어있지 않으며, 각각의 Property의 이름을 각각 적어서 생성하게 된다. 이 부분은 C# 4.0에서 dynamic programming과 비슷하게 보이지만 dynamic으로 선언된것과는 다르게 사용된다. var로 선언되어 익명 class로 생성된 상태이다.
여기에서 bd에 대해 type을 얻어보면 다음과 같다.
<>f__AnonymousType1`5[String, String, String, String, String]
사용된 Item, Description, User, Date, Price에 대해서 5개의 Property를 갖는 익명 Class의 선언으로 되어 있는 것을 알 수 있다.