2016-08-09 21 views
6

Sorun: tüm kayıtları döndürme whereJon Doe=<bus_contact>VEYA<bus_sponsor>.XML sorgulanırken LINQ'da OR koşulu nasıl eklenir?

Geçerli kod, kayıt 1'i döndürür; bu nedenle, yalnızca bir sorgu kullanarak kayıtları 1 ve 2 döndürmek için hangi değişikliklerin yapılması gerekir?

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

Düzenleme: Bu tam olası yinelenen linkte belirttiği gibi aynı sorun değildir. Evet, kısmi olarak buna atıfta bulunur, fakat yeni başlayan bir kişi, kabul edilen yanıtın sağladığı uygun içerikle bir cevap almak olarak oldukça faydalıdır. Böyle Any birlikte

+0

Olası yinelenen Element yöntemini kullanarak her türlü (bus_contact, bus_sponsor, vs.) Eğer tüm sorguyu kolaylaştırabilirsiniz sadece bir alt öğesi öğesi varsa linq] (http://stackoverflow.com/questions/2059488/multiple-descendants-types-linq) –

cevap

4

Kullanım ||:

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

Any kullanarak aslında çocuk seviyesine inen olmadan bir çocuğun üzerine bir durumdan sorgulamak sağlar. Bu, Parent seçerek ağaca geri tırmanmanın gerekliliğini ortadan kaldırdı.

+0

Harika. Teşekkürler!!! Zaman sınırı biter bitmez cevap kabul edilecektir. – cyboashu

1

her row eleman yerine [Birden torunları türlerinden 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

teşekkürler. bunu bilmiyordum. ++ – cyboashu

+1

@cyboashu yanıtlamak için eklenmedi, ancak 'row' etiketi 'root'un tek çocuklarıysa,' 'Elements' (çoğul) – Sehnsucht

+0

tarafından' Descendants' yerine de kullanılabilir. Tekrar teşekkürler.! – cyboashu

İlgili konular