2012-02-13 4 views
0

Quelqu'un peut-il s'il vous plaît suggérer comment je pourrais modifier ce qui suit afin que je puisse retourner IQueryable<B> de repoA étant donné un prédicat de Func<B, bool>?Comment diffuser à partir de IQueryable <T> à IQueryable <U> et <Func <T, bool>> à <Func <U, bool>> pour le plaisir?

Merci d'avance.

interface IRepo<T> { 
    IQueryable<T> FindBy(Func<T, bool> predicate); 
} 

class A { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class RepoA : IRepo<A> { 
    public IQueryable<A> FindBy(Func<A, bool> predicate) { 
     return new EnumerableQuery<A>(new A[1]); 
    } 
} 

class B { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class RepoB : IRepo<B> { 
    IRepo<A> repoA = new RepoA(); 
    public IQueryable<B> FindBy(Func<B, bool> predicate) { 
     var newPredicate = Magic goes here; 
     var queryableA = repoA.FindBy(newPredicate); 
     var queryableB = More magic goes here; 
    } 
} 
+1

c'est ce que vous faites pour vous amuser? devenir fou avec des génériques? :) – RPM1984

+0

notez que tout texte avec '<'s and '>' dans * doit * être formaté en code (backticks ou quatre espaces-indent) pour apparaître. Voir mon edit pour un exemple. – AakashM

Répondre

5

Vous devez faire cela par cartographie le IQueryable<A> à un IQueryable<B>. La bonne méthode pour cela est Select:

var queryableB = queryableA.Select(a => new B { Id = a.Id, Name = a.Name }); 

En ce qui concerne la cartographie du prédicat - vous pouvez créer un nouveau prédicat qui fait la mise en correspondance de la même manière:

var newPredicate = a => predicate(new B { Id = a.Id, Name = a.Name }); 

Ces travaux en créant une nouvelle instance B en ligne qui est construit en utilisant les propriétés du passé dans une instance ...

+0

@sarfeast - Ce serait bien si vous commenciez à accepter des réponses, ou si la réponse n'est pas acceptable, ajoutez un commentaire expliquant pourquoi. – mbeckish

Questions connexes