如何从IQueryable <t>转换为IQueryable <u>和<func <t,bool =“”>&gt;到<func <u,bool =“”>&gt;为了好玩?</func <u,> </func <t,> </u> </t>

时间:2012-02-13 20:22:45

标签: c# .net linq generics

有人可以建议我如何修改以下内容,以便我可以IQueryable<B>从[{1}}返回repoA谓词Func<B, 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 个答案:

答案 0 :(得分: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实例的属性构建...