2016-03-19 4 views
1

Ich habe folgende Modelle:Wie projiziert Hierarchie mit Linq?

public class Addressbook() 
{ 
    public ICollection<Person> Persons { get; set;} 
} 

public class Person() 
{ 
    public Title Title { get; set; } 
    public Address Address { get; set; } 
} 

public class Address() 
{ 
    public PostCode PostCode { get; set; } 
} 

Ich habe die folgende Methode in meinem generic-Repository:

public virtual IQueryable<T> Get(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] include) 
{ 
    if (include.Any()) 
    { 
     var set = include.Aggregate<Expression<Func<T, object>>, IQueryable<T>> 
        (dbSet, (current, expression) => current.Include(expression)); 

     return set.Where(predicate); 
    } 

    return dbSet.Where(predicate); 
} 

Um eine Addressbook lade ich zu tun bin versucht:

public override Addressbook Get(Expression<Func<Addressbook, bool>> predicate) 
{ 
    return base.Get(predicate, x => x.Persons.Select(t => t.Title) 
              .Select(a => a.Address) 
              .Select(p => p.PostCode)); 
} 

Allerdings bekomme ich einen Kompilierfehler:

Title does not contain a definition for Address.

Wie lautet die richtige Linq-Syntax für diese Art der Projektion?

Antwort

1

Sie tun .Select(t => t.Title), die eine IEnumerable<Title> zurückgibt. Dann versuchen Sie .Select(a => a.Address) von ihm, aber Title enthält kein Mitglied Address - Person tut. Sie erhalten also den Kompilierungsfehler.

Da Sie mehrere Ausdrücke liefern kann durch params aufzunehmen, sollten Sie diese stattdessen tun:

public override Addressbook Get(Expression<Func<Addressbook, bool>> predicate) 
{ 
    return base.Get(predicate, 
        x => x.Persons.Select(person => person.Title), 
        x => x.Persons.Select(person => person.Address.PostCode)); 
} 
Verwandte Themen