どうすればキャストできますか
Expression<Func<T, bool>> predicate
に
Expression<Func<SomeType, bool>> predicate
?
今のところ方法が見つかりません。または、少なくともExpression<Func<SomeType, bool>>
述語の最初の文字列表現を使用して、新しいものを作成します。
それが役立つ場合T
は、 を実装するタイプに限定されISomeInterface
、それをSomeType
実装します。
LE: さらなる説明
インターフェイスは次のようなものです。
public interface ICacheable
{
List<T> GetObjects<T>(Expression<Func<T, bool>> predicate) where T : ICacheable;
}
それからあなたは持っています
public partial class Video : ICacheable
{
public List<T> GetObjects<T>(Expression<Func<T, bool>> predicate) where T : ICacheable
{
// implementation here that returns the actual List<Video>
// but when I try to query the dbcontext I can't pass a predicate with type T, I have to cast it somehow
List<Video> videos = db.Videos.Where(predicate).ToList(); // not working
}
}
次に、次のようになります。
public class RedisCache
{
public List<T> GetList<T>(Expression<Func<T, bool>> predicate) where T : ICacheable
{
List<T> objList = // get objects from cache store here
if(objList == null)
{
List<T> objList = GetObjects<T>(predicate);
// cache the result next
}
return objList;
}
}
私は次のように任意のクラスから上記を使用します:
// If the list is not found, the cache store automatically retrieves
// and caches the data based on the methods enforced by the interface
// The overall structure and logic has more to it.
List<Video> videos = redisCache.GetList<Video>(v => v.Title.Contains("some text"));
List<Image> images = redisCache.GetList<Image>(v => v.Title.Contains("another text"));
そして、これをキャッシュ可能にする必要がある任意のタイプのオブジェクトに拡張し、エンティティまたはエンティティのリストがキャッシュに見つからない場合にキャッシュ ストアが自動的に取得できるようにするメソッドを使用します。私はこれを完全に間違っているかもしれません。