4

私は以下のようなリポジトリインターフェースを持っています:

public interface IDataContext<TId> : IDisposable
{
    IQueryable<T> Repository<T>() where T : class, IEntity<TId>;
    T FindById<T>(TId id) where T : class, IEntity<TId>;
    void Insert<T>(T item) where T : class, IEntity<TId>;
    void Delete<T>(T item) where T : class, IEntity<TId>;
    void Commit();
}

Repository<T>を返すことに注意してくださいIQueryable<T>

Repository<T>以下のメソッドを使用して、LinqToSQL データ コンテキストをラップできるクラスがあります。

public IQueryable<T> Repository<T>() where T : class, IEntity<int>
{
    ITable table = _context.GetTable(GetEntityType<T>());
    return table.Cast<T>();
}

これはうまくいきます、私は次のようなことができます

new Repository(new SQLDataContext())
    .Repository<MyEntity>().Where(e => SqlMethods.Like(e.Id, "123%");

今、キャッシングについて考え始めましたが、問題があります。

IDataContext<TId>への呼び出しからの結果をメモリにキャッシュする をラップして実装するクラスを作成しましたRepository<T>。以下のようなもの:

public IQueryable<T> Repository<T>() where T : class, IEntity<TId>
{
    // Actual caching logic here.....        

    return _CachedEntities[typeof(T)].OfType<T>().AsQueryable<T>();
}

私が抱えている問題は、現在、IQueryable<T>返される I がメモリ内にあり、SQL に変換されていないため、使用に関する例外が発生することSqlMethods.Likeです。

TL;DR:IDataContext<T>では、呼び出し元のクラスが処理対象がインメモリ リポジトリ (つまり、キャッシュ リポジトリ) であるか通常の LinqToSQL であるかを気にする必要がないように、キャッシュ リポジトリ ラッパーを作成するにはどうすればよいでしょうか。リポジトリ?

4

1 に答える 1