2012-04-04 23 views
2

Ich habe eine Methode, die ein Array von Zeichenfolgen als Parameter und Abfragen für eine Sammlung Eigenschaft, die auch eine Sammlung von Zeichenfolgen ist. Wenn für diese Eigenschaft einer der Werte innerhalb des Zeichenfolgenarrays als Parameter übergeben wird, sollte sie zurückgegeben werden.Linq Abfrage gegen eine Sammlung Eigenschaft mit einer Sammlung Parameter

Hier ist mein 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; 
     } 
    } 
} 

Hinweis:

Dies ist die komplette Code:

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

Dies macht den Job, aber es doesn nur‘ t scheinen richtig. Ich hätte das mit einigen Erweiterungsmethoden besser machen können, aber ich konnte nicht herausfinden, was das tun würde, und diese Implementierung richtig machen.

Irgendeine Idee?

Antwort

4

Wie wäre es damit:

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

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

Möglicherweise möchten Sie ToList() nennen das Ergebnis materialisieren. Beachten Sie, dass dies (hoffentlich!) Zu einer IN Abfrage in SQL führt; Wenn Sie eine große Anzahl von Tags haben, wäre ich nicht überrascht, wenn das fehlgeschlagen wäre. (Ich weiß nicht, wie das Entity Framework mit dieser Situation umgeht.) Ich glaube jedoch, dass es mit kleineren Anzahlen von Tags in Ordnung sein sollte.

Beachten Sie, dass von der Version des Entitätsframeworks abhängig sein kann, das Sie verwenden; Ich glaube mich zu erinnern, dass einige Transformationen wie diese (mit Contains in einer "lokalen" Sammlung), um sie in IN in SQL zu übersetzen, sich im Laufe der Zeit verbessert haben. Stellen Sie sicher, dass Sie gegen die gleiche Version entwickeln, gegen die Sie bereitstellen :)

+1

Ah, ich fühle mich jetzt so schlecht. Ich schätze, ich sollte nach 1 Uhr morgens nicht mehr programmieren. Vielen Dank! – tugberk

+0

@tugberk: Haben Sie überprüft, dass es tatsächlich funktioniert * obwohl? Nimm es nicht an, bis du es ausprobiert hast :) Ich kann ziemlich gut vorhersagen, wie sich LINQ zu Objects verhalten wird, aber ich habe sehr wenig Erfahrung (im Wesentlichen Null) mit dem Entity Framework. –

+0

Auch sollte ich erwähnen, dass diese Abfrage wirklich nicht zu SQL Server geht. Ich habe eine Tag-Sammlung über Semikolon-getrennte Zeichenfolge erstellt (wie hier: https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/Model/BlogPost.cs). Also, es bekommt die ganzen Daten mit 'GetAll' (ja, es ist ein wirklich schlechter Ansatz, aber ich konnte nicht anders herum herausfinden) und macht die Abfrage dagegen. So ist es meistens Linq zu Objetcs. – tugberk

Verwandte Themen