在我的代码中,我想让我的存储库IQueryable。这样,选择标准将是一个linq表达式树。
现在,如果我想在理论中模拟我的存储库,这非常简单:只需实现我的存储库的接口(也是一个IQueryable对象)。
我的模拟存储库实现只是内存集合,但我的问题是:你知道一种简单的方法来实现我的模拟的IQueryable接口,将查询传输到我的内存中集合(IEnumerable)吗? / p>
感谢您的回复,
精确度
我的存储库的客户端对象将以这种方式使用我的存储库:
var result =来自MyRepository中的条目,其中entry.Product ==“SomeProduct”选择条目;
ToList或AsEnumerable是执行查询并将结果作为List或IEnumerable返回的。但是我必须在我的存储库中实现IQueryable接口,使用IQueryProvider将表达式转换为对IEnumerable对象的调用。
解决方案
解决方案的实现是使用AsQueryable将对IQueryable的调用委托给我的内存集合。
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
}
答案 0 :(得分:1)
在你的模拟中使用AsQueryable。现在它们是可查询的,你可以像对待任何其他可查询一样对待它们。
答案 1 :(得分:0)
您可以使用扩展方法
.ToList<>