2010-11-30 16 views
1

Ich habe eine Sammlung von "Produkt" -Objekten, die jeweils eine Sammlung von Vorteilsobjekte enthalten. Siehe unten:Spezifischen Wert von verschachtelten Sammlungen mit LINQ erhalten

<Products> 
     <Product ID="454"> 
      <ProductName>Economy</ProductName> 
      <Benefits> 
       <Benefit> 
        <Name>Medical</Name> 
        <Value>5000000</Value> 
        <Excess>100</Excess> 
       </Benefit> 
       <Benefit> 
        <Name>Emergency</Name> 
        <Value>350</Value> 
        <Excess>100</Excess> 
       </Benefit> 
     </Product> 
</Products> 

Ich versuche, eine LINQ-Abfrage erstellen für das Produkt "454", um den "Medical" Nutzen-Wert zu erhalten:

<%: Model.Products.Where(x => x.ProductId == "454").SelectMany(p => p.Benefits).Where(b => b.Name == "Medical").Select(v => v.Value.ToString()) %> 

Doch diese gibt nur:

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Domain.Entities.Benefit,System.String] System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Domain.Entities.Benefit,System.String] System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Domain.Entities.Benefit,System.String] System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Domain.Entities.Benefit,System.String 

Wie erhalte ich den tatsächlichen Wert, nach dem ich suche?

Antwort

4

Wenn Sie wissen, es gibt nur eine (garantiert) dann .Single() hinzufügen - wenn es keine geben könnte/some und Sie wollen einfach nur die erste, fügen .FirstOrDefault() (wird null zurück, wenn es gibt keine Treffer)

+1

Wenn die Sammlung leer sein könnte, schauen Sie auch in SingleOrDefault() oder FirstOrDefault() –

+0

@Joshua - sorry, gemeint FirstOrDefault ... – cjk

+0

Das ist toll. Danke für Ihre Hilfe. – FloatLeft

0

versuchen, diese :

var val = employees.Where(p => p.ProductId == 454).FirstOrDefault().Benefits.Select(b => b.Value).FirstOrDefault(); 

oder

var benefits_value = employees.Where(p => p.ProductId == 454).Single().Benefits.Select(b => b.Value).Single(); 
2

versuchen diese

Verwandte Themen