2016-03-19 13 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; } 
} 

私は、一般的なリポジトリに次のような方法があります。私がやろうとしているAddressbookをロードするには

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

を:

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)); 
} 
関連する問題