如何从IQueryable<;T>;至IQueryable<;U>;并且<;Func<;T、 b

本文关键字:lt gt IQueryable Func 并且 | 更新日期: 2023-09-27 18:24:30

有人能建议我如何编辑以下内容,以便在给定谓词Func<B, bool>的情况下从repoA返回IQueryable<B>吗?

提前谢谢。

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

如何从IQueryable<;T>;至IQueryable<;U>;并且<;Func<;T、 b

您可以通过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实例的属性构建的。。。