2016-03-19 47 views
1

我有以下型號:如何使用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; } 
} 

我在通用存儲庫下面的方法:

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); 
} 

要加載Addressbook我想要做的事:

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)); 
} 

但是,我收到一個編譯錯誤:

Title does not contain a definition for Address.

這種投影的正確Linq語法是什麼?

回答

1

你在做.Select(t => t.Title),它返回IEnumerable<Title>。然後你試圖從.Select(a => a.Address),但Title不包含會員Address - Person呢。所以你會說編譯錯誤。

既然你可以提供多個表達式通過params包括,則應該這樣做:

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)); 
}