2016-10-31 3 views
0

In meinem Beispiel habe ich Bibliotheken und Bücher .. Ich muss Bibliotheken zurückgeben, die ein bestimmtes Buch haben. Ich kann das gut mit Standard LINQ Where (.Any()), aber mit Schwierigkeiten mit Dynamic Linq tun.Dynamic Linq - Auswählen von übergeordneten Objekten aus untergeordneten Eigenschaften

Unten ist Beispielcode. Mein Fehler tritt bei Objekt 14 auf.

protected void Page_Load(object sender, EventArgs e) 
    { 
     List<Library> libraries = new List<Library>(); 
     libraries.Add(new Library() { Name = "New York" }); // NO BOOKS FOR NY 

     List<Book> books = new List<Book>(); 
     books.Add(new Book() { Title = "Colors" }); 
     books.Add(new Book() { Title = "Gardening for Noobs" }); 
     libraries.Add(new Library() {Name = "Boston", Books = books }); 

     // GET NEW YORK LIBRARY 
     List<Library> l1 = libraries.Where(x => x.Name == "New York").ToList(); // STANDARD 
     List<Library> l2 = libraries.AsQueryable().Where("Name = \"New York\"").ToList(); // DLINQ 

     // GET LIBRARIES WITH BOOK = COLORS 
     List<Library> l3 = libraries.Where(x => x.Books != null && x.Books.Any(a => a.Title == "Colors")).ToList(); // STANDARD 
     List<Library> l4 = libraries.AsQueryable().Where("Books.any(Title = \"Colors\"").ToList(); // ERROR: No property or field 'Title' exists in type 'Library' 

    } 


    public class Library 
    { 
     private string _name; 
     private List<Book> _books; 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 
     public List<Book> Books 
     { 
      get { return _books; } 
      set { _books = value; } 
     } 
    } 

    public class Book 
    { 
     private string _title; 
     public string Title 
     { 
      get { return _title; } 
      set { _title = value; } 
     } 
    } 

Antwort

1

Sie verfehlten eine Klammer und null cheking. Jetzt funktioniert es gut

List<Library> l4 = libraries.AsQueryable().Where("Books != null && Books.any(Title = \"Colors\")").ToList(); 

Update: denke ich dieses Problem nicht in diesem Teil Code: https://dotnetfiddle.net/F2uTie

+0

Vielen Dank, aber ich bekomme immer noch den gleichen Fehler "Keine Eigenschaft oder Feld 'Titel' existiert im Typ 'Bibliothek'". – Paul

+0

@Paul versuche mein Update zu überprüfen –

+0

Perfekt! Meine Referenzdatei für System.Linq.Dynamic war nicht korrekt. Ich habe das neueste von NuGet aktualisiert und das Problem behoben. – Paul

0

Aus dem Speicher müssen Sie Books auswählen, bevor Sie es verwenden können. Dies gilt nur für Navigationseigenschaften wie Books ...

List<Library> l4 = libraries.AsQueryable() 
    .SelectMany("Books") 
    .Where("Title = \"Colors\"") 
    .Select("Library") 
    .ToList(); 

Sie werden hinzufügen müssen Library-Book

+0

Ich glaube nicht, dass dies funktionieren wird als 'Book' kein' Library' hat Eigentum. Es sollte aber wahrscheinlich. –

+0

Also Bibliotheken sollten Sammlung von Büchern haben, und Bücher sollten eine Sammlung von Bibliotheken haben? Warum? – Paul

Verwandte Themen