2012-02-13 73 views
0

有人可以请建议我如何编辑以下内容,以便我可以返回IQueryable<B>repoA给定谓词Func<B, bool>如何从IQueryable <T>投掷到IQueryable <U>和<Func <T, bool>>到<Func <U, bool>>以获得乐趣?

在此先感谢。

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

这是您为了好玩而做的事情吗?仿制药疯了吗? :) – RPM1984 2012-02-13 20:26:25

+0

请注意,任何带有'<'s and '>'*的文本必须*被格式化为代码(反引号或四空格缩进)才能出现。查看我的编辑例子。 – AakashM 2012-02-14 09:09:44

回答

5

你会被映射IQueryable<A>IQueryable<B>做到这一点。这样做的正确方法是Select

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

至于映射谓词 - 你可以创建一个新的谓词,做映射以同样的方式:

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

这些工作通过创建一个新型B实例内联使用传入的A实例的属性构造...

+0

@sarfeast - 如果您开始接受答案,或者如果答案不可接受,请添加注释,解释原因。 – mbeckish 2012-08-29 19:21:01

相关问题