2016-08-09 15 views
6

Sự cố: trả lại tất cả hồ sơ whereJon Doe=<bus_contact>HOẶC<bus_sponsor>.Làm thế nào để thêm OR điều kiện trong LINQ trong khi truy vấn XML?

Bản ghi trả về mã hiện tại 1, vì vậy những sửa đổi nào được yêu cầu trả về bản ghi 1 và 2 chỉ bằng một truy vấn ?.

XML

<root> 
    <row> 
    <project_id>1</project_id> 
    <project_name>Name1</project_name> 
    <bus_contact>Jon Doe</bus_contact> 
    <bus_sponsor>Bruce Wayne</bus_sponsor> 
    </row> 
    <row> 
    <project_id>2</project_id> 
    <project_name>Name2</project_name> 
    <bus_contact>Peter Parker</bus_contact> 
    <bus_sponsor>Jon Doe</bus_sponsor> 
    </row> 
</root> 

C#

class Program 
{ 
    static void Main (string[] args) 
    { 
     XElement main = XElement.Load ("master_list.xml"); 

     var results = main.Descendants ("row") 
      .Descendants ("bus_contact") 
      .Where (e => e.Value == "Jon Doe") 
      .Select (e => e.Parent)    
      .Select (e => new { 
       project_id = e.Descendants ("project_id").FirstOrDefault().Value, 
       project_name = e.Descendants ("project_name").FirstOrDefault().Value 
      }); 

     foreach (var result in results) 
      Console.WriteLine ("{0}, {1}", result.project_id, result.project_name); 
     Console.ReadLine(); 
    } 
} 

Sửa: Đây không phải là chính xác cùng một vấn đề như đã chỉ ra trong các liên kết trùng lặp càng tốt. Có, nó một phần đề cập đến điều đó nhưng như một người mới bắt đầu nhận được một câu trả lời với bối cảnh thích hợp, mà câu trả lời được chấp nhận cung cấp, là khá hữu ích.

+0

trùng lặp có thể xảy ra của [Nhiều con cháu các loại LINQ] (http://stackoverflow.com/questions/2059488/multiple-descendants-types-linq) –

Trả lời

4

Sử dụng || kết hợp với Any, như thế này:

var results = main.Descendants("row") 
    .Where(r => 
     r.Descendants("bus_contact").Any(c => c.Value == "Jon Doe") 
    || r.Descendants("bus_sponsor").Any(c => c.Value == "Jon Doe") 
    ); 

Sử dụng Any cho phép bạn truy vấn bởi một điều kiện về một đứa trẻ, mà không thực sự giảm dần đến mức đứa trẻ. Điều này loại bỏ sự cần thiết phải leo lên cây trở lại bằng cách chọn Parent.

+0

Tuyệt vời. cảm ơn!!! Câu trả lời sẽ được chấp nhận ngay khi hết thời hạn. – cyboashu

1

Nếu mỗi phần tử row chỉ có một mục subelement của từng loại (bus_contact, bus_sponsor, vv), bạn có thể đơn giản hóa toàn bộ truy vấn bằng cách sử dụng phương pháp Element thay vì Descendants

var results = 
    main.Descendants ("row") 
    .Where (r => r.Element("bus_contact").Value == "Jon Doe" 
       || r.Element("bus_contact").Value == "Jon Doe") 
    .Select (r => new { 
     project_id = r.Element("project_id").Value, 
     project_name = r.Element("project_name").Value 
    }); 
+0

cảm ơn. không biết điều này. ++ – cyboashu

+1

@cyboashu không được thêm vào câu trả lời nhưng nếu thẻ 'row' là con duy nhất của' root' bạn cũng có thể thay thế 'Con cháu 'bằng' Elements' (số nhiều) – Sehnsucht

+0

tuyệt vời. cảm ơn một lần nữa.! – cyboashu

Các vấn đề liên quan