私は以下のようなリポジトリインターフェースを持っています:
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 であるかを気にする必要がないように、キャッシュ リポジトリ ラッパーを作成するにはどうすればよいでしょうか。リポジトリ?