3

私のコードでは、リポジトリを 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
    }
4

2 に答える 2

1

モックでAsQueryableを使用します。これらはクエリ可能になり、他のクエリ可能オブジェクトと同じように扱うことができます。

于 2009-02-02T13:50:50.107 に答える
0

拡張メソッドを使用できますか

.ToList<>
于 2009-02-02T13:35:02.680 に答える