2010-10-04 8 views
1

J'essaie d'utiliser LINQ pour interroger une liste d'objets, le cas échéant. Actuellement, je suis bloqué sur la syntaxe d'une requête imbriquée dont j'espère que vous pourrez m'aider.Sous-requête C# LINQ (Sur les entités)

Classes:

public class FooType 
{ 
    public int Id { get; set; } 

    public IList<Foo> Foos { get; set; } 

} 

public class Foo 
{ 
    public int FooTypeId { get; set; } 

    public string CorrelationId { get; set; } 
} 

public class Bar 
{ 
    public string FooCorrelationId { get; set; } 
} 

Utilisation:

IList <FooType> fooTypes = new List <FooType>(); 
// ... add a lot of FooTypes, each enriched with some Foos 
Bar bar = new Bar(){FooCorrelationId = "abcdef"}; 
Foo foo = fooTypes.Where(ft => ft.Foos.Where(f => f.CorrelationId == bar.FooCorrelationId)).First<Foo>(); 

Cela échoue parce que la WHERE expression extérieure est alimentée par quelque chose qui ne fournit pas une valeur de retour booléenne. Comme vous pouvez le deviner, je compte quelque chose comme ce qui suit dans LINQ:

foreach (FooType fooType in fooTypes) 
{ 
    Foo foo = fooType.Foos 
         .Where(f => f.CorrelationId == bar.FooCorrelationId) 
         .First(); 
} 

Avez-vous une idée de comment obtenir ce Foo je cherche, celui avec CorrelationId « abcdef »?

Et encore une question pour les benchmarks: Qu'en est-il de la performance? LINQ optimise-t-il ses requêtes? Ou le résultat est-il le même qu'une itération sur les objets comme je l'ai fait dans mon bloc "quelque chose comme"?

Merci beaucoup d'avance!

Répondre

4

Il suffit de remplacer l'extérieur où un SelectMany et obtenir la première

Foo foo = fooTypes 
    .SelectMany(ft => ft.Foos.Where(f => f.CorrelationId == bar.FooCorrelationId)) 
    .First(); 

Si vous d'obtenir un premier Foo dans tous FooType, ce qui a CorrelationId == FooCorrelationId.

+0

Merci beaucoup, c'était exactement ce que je cherchais! Je vais devoir prendre un peu de temps pour améliorer mes compétences en linq =) –

Questions connexes