我有一个接口(interface),可以从“存储库”模式定义存储库:

interface IRepository
{
    List<Customer> GetAllCustomers(Expression<Func<Customer, bool>> expression);
}

我已经针对 Entity Framework 实现了它:
class EntityFrameworkRepository
{
    public List<Customer> GetAllCustomers(Expression<Func<Customer, bool>> expression)
    {
        return DBContext.Customers.Where(expression).ToList();
    }
}

看来效果很好,它使我可以执行以下操作:
var customers = entityFrameworkRepository.Where(
    customer => String.IsNullOrEmpty(customer.PhoneNumber)
);

现在,我想拥有一个用于测试和演示目的的InMemoryRepository。我试图创建一个:
class InMemoryRepository
{
    Dictionary<int, Customer> Customers {get; set;} = new Dictionary<int, Customer>();

    public List<Customer> GetAllCustomers(Expression<Func<Customer, bool>> expression)
    {
        //what do I put here?
    }
}

如您在上面的代码中看到的,我对InMemoryRepository.GetAllCustomers实现的方法感到困惑。我该怎么办才能通过提供的表达式过滤客户并返回结果?

我试过了:
return Customers.Where(expression));

但是很明显,这是一个Func<KeyValuePair<int, Customer>, bool>的代码,所以我得到了一个编译错误:

最佳答案

尝试.AsQueryable()方法:

return Customers.Values.AsQueryable().Where(expression);

10-08 00:02