私のコードでは、リポジトリを IQueryable にしたいと考えています。このように、選択の基準は linq 式ツリーになります。
理論的にリポジトリをモックしたい場合、これは非常に簡単です。リポジトリのインターフェイスを実装するだけです (これは IQueryable オブジェクトでもあります)。
私のモック リポジトリの実装はインメモリ コレクションにすぎませんが、私の質問は、クエリをインメモリ コレクション (IEnumerable) に転送するために、モックの IQueryable インターフェイスを実装する簡単な方法を知っていますか?
ご返信ありがとうございます、
ある程度の精度
私のリポジトリのクライアント オブジェクトは、私のリポジトリを次のように使用します。
var result = MyRepository のエントリから。entry.Product == "SomeProduct" select entry;
ToList または AsEnumerable とは、クエリを実行し、結果を List または IEnumerable として返すことです。しかし、IEnumerable オブジェクトへの呼び出しで式を変換する IQueryProvider を使用して、リポジトリに IQueryable インターフェイスを実装する必要があります。
解決
ソリューションの実装では、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
}