2 votes

Requête Linq contre une propriété de collection avec un paramètre de collection

J'ai une méthode qui prend un tableau de chaînes de caractères comme paramètre et interroge une propriété de collection qui est aussi une collection de chaînes de caractères. Si cette propriété a l'une des valeurs contenues dans le tableau de chaînes passé en paramètre, elle doit être renvoyée.

Voici mon code :

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) {

    foreach (var tag in tags) {
        foreach (var blogPost in GetAll(includeUnapprovedEntries).
            ToList().Where(x => x.Tags.Any(t => t == tag))) {
            yield return blogPost;
        }
    }
}

Nota:

Voici le code complet :

https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/BlogPostRepository.cs

Ça fait l'affaire, mais ça ne semble pas correct. J'aurais pu l'améliorer avec des méthodes d'extension, mais je n'ai pas réussi à trouver ce qui ferait l'affaire et rendrait cette implémentation correcte.

Une idée ?

4voto

Jon Skeet Points 692016

Que dites-vous de ça ?

public IEnumerable<BlogPost> GetAll(string[] tags,
    bool includeUnapprovedEntries = false) {

    return GetAll(includeUnapprovedEntries)
        .Where(x => x.Tags.Any(t => tags.Contains(t));
}

Vous pouvez appeler ToList() pour matérialiser le résultat. Notez que cela donnera (espérons-le !) un résultat IN en SQL ; si vous avez un grand nombre de balises, je ne serais pas surpris que cela échoue. (Je ne sais pas comment l'Entity Framework gère cette situation.) Je pense que ça devrait aller avec un plus petit nombre de balises.

Notez que, que cela soit supporté ou non mai dépendent de la version du cadre d'entité que vous utilisez ; je crois me souvenir que certaines transformations comme celle-ci (utilisant des Contains sur une collection "locale") à traduire en IN dans SQL) se sont améliorées au fil du temps. Assurez-vous que vous développez avec la même version que celle que vous allez déployer :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X