Wählen Sie eine Zeichenfolge in einer Liste von strings mit linq

Hier habe ich eine Liste von string in den standorten1. Ich brauche, um zu überprüfen, die gemeinsamen Elemente zwischen den standorten1 und items1 und wählen Sie die passenden Elemente aus items1. Hier ist mein code

 string query = "/sitecore/content/*";
 List<string> sites1 = Sitecore.Configuration.Settings.Sites.Select(x => x.StartItem.TrimStart('/')).ToList();
 List<Item> items1 = Sitecore.Context.Database.SelectItems(query).Where(x => x.DisplayName.Contains(sites1)).ToList();

Jede Anregung?

Bearbeiten:
Hier bin ich immer die Fehler bei der Auswahl von zwei Elementen

 var sites = Sitecore.Configuration.Settings.Sites.Select(f => new List<string>() { f.StartItem.TrimStart('/'), f.Language }).ToList();
 List<Item> items = Sitecore.Context.Database.SelectItems(query).Where(x => sites.Contains(x.DisplayName.ToLower())).ToList();
  • Habe es ausprobiert und bekomme folgenden Fehler “ Sitecore.Daten.Elemente.Element “ enthält keine definition für ‚den standorten1‘ und keine Erweiterungsmethode ‚den standorten1‘ die Annahme ein erstes argument vom Typ ‚Sitecore.Daten.Elemente.Element‘ gefunden werden konnte (fehlt eine using-Direktive oder ein Assemblyverweis?)
  • Sorry mad schlecht! sites1.Contains(x.DisplayName) entfernen x.
  • Wo benutzen Sie Feld „Sprache“?
  • Ich brauche es für eine spätere Verwendung
  • Verwenden Sie „Sprache“ in der zweiten Abfrage SelectItems().Wo(…) ?
  • Nein……

InformationsquelleAutor Rooney | 2016-01-09



2 Replies
  1. 2

    Sollte es anders herum sein: site1.Contains(x.DisplayName).
    Auch im Vergleich zu einer Liste HashSet<string> ist effizienter für mehrere look-ups, das wird erkennbar, wenn die Anzahl der Elemente erhöht.

    var sites1 = new HashSet<string>(Sitecore.Configuration.Settings.Sites
            .Select(x => x.StartItem.TrimStart('/')));
    
    var items1 = Sitecore.Context.Database.SelectItems(query)
            .Where(x => site1.Contains(x.DisplayName))
            .ToList();

    EDIT:

    Habe ich nicht bemerkt, dass SelectItems() gibt IQueriable. In diesem Fall würde ich neu schreiben die zweite Anweisung mit IEnamerable.Any<> Erweiterung Methode, die projiziert werden kann, in SQL server-Abfrage.

    var items1 = Sitecore.Context.Database.SelectItems(query)
            .Where(x=>sites1.Any(it=>it == x.DisplayName))
            .ToList();

    EDIT 2:
    Korrektur der Abfrage aus der bearbeiteten Frage:

    var sites1 = Sitecore.Configuration.Settings.Sites
            .Select(x => new {DisplayName = x.StartItem.TrimStart('/'), Language = x.Language});
    
    var siteNames = new HashSet<string>(sites1.Select(x=> x.DisplayName.ToLower());
    
    var items1 = Sitecore.Context.Database.SelectItems(query)
            .Where(x=>siteNames.Any(it=>it == x.DisplayName.ToLower()))
            .ToList();
    • Tun HashSet<>s Arbeit auf eine IQueryable<>?
    • Schauen Sie auf meine Frage bearbeitet
    • siehe meine edits
    • Ihre werfen Fehler in der ersten Zeile selbst
    • DisplayName doesnot exist
    • Jetzt adaequat..Schätze Ihre Hilfe

  2. 2
    List<Item> items1 = Sitecore.Context.Database.SelectItems(query).Where(x => sites1.Contains(x.DisplayName)).ToList();

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.