在我的代码中,我想让我的存储库 IQueryable。这样,选择的标准将是一个 linq 表达式树。
现在,如果我想在理论上模拟我的存储库,这很容易:只需实现我的存储库的接口(这也是一个 IQueryable 对象)。
我的模拟存储库实现将只是一个内存集合,但我的问题是:你知道一种简单的方法来实现我的模拟的 IQueryable 接口,将查询传输到我的内存集合(IEnumerable)吗?
感谢您的答复,
一些精度
我的存储库的客户端对象将以这种方式使用我的存储库:
var result = from entry in MyRepository where entry.Product == "SomeProduct" 选择条目;
ToList 或 AsEnumerable 的作用是执行查询并将结果作为 List 或 IEnumerable 返回。但是我必须在我的存储库上实现 IQueryable 接口,并使用 IQueryProvider 将调用中的表达式转换为 IEnumerable 对象。
解决方案
该解决方案的实现是将调用 IQueryable 委托给我使用 AsQueryable 的内存集合。
public class MockRepository : IQueryable<DomainObject>
{
private List<DomainObject> inMemoryList = new List<DomainObject>();
#region IEnumerable<DomainObject> Members
public IEnumerator<DomainObject> GetEnumerator()
{
return inMemoryList.GetEnumerator();
}
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return inMemoryList.GetEnumerator();
}
#endregion
#region IQueryable Members
public Type ElementType
{
get
{
return inMemoryList.AsQueryable().ElementType;
}
}
public Expression Expression
{
get
{
return inMemoryList.AsQueryable().Expression;
}
}
public IQueryProvider Provider
{
get
{
return inMemoryList.AsQueryable().Provider;
}
}
#endregion
}