私は Entity Framework 5.0 を使用しており、式は推奨事項「 LINQ-to-Entities で型メンバーをサポートしていますか?」に記載されています。
public static Expression <Func <Category , bool >> IsRootExpression
{
get
{
return p => p!= null && !p.ParentId.HasValue;
}
}
「Entity Framework Extended Library」 https://github.com/loresoft/EntityFramework.Extendedのキャッシュを使い始めるまで、すべてがうまくいきました。
現在、クエリで式 IsRootExpression を使用すると、自動的に、またはタグと強制的な有効期限を使用して、キャッシュの有効期限が切れません。キャッシングを使用し、式を使用しないコードは適切に機能し、更新されたデータを返します。
キャッシングと式の両方を使用するには?
テストするには、次のコードを使用します:
データが更新されます:
var rep = new CategoryRepository ();
var testRoot = rep.AllIncluding(it => it.Items)
.Where(it=> !it.ParentId.HasValue)
.FirstOrDefault();
testRoot.Title = "test root " + DateTime .Now.ToLongTimeString();
rep.Save();
var tag = "test_tag" ;
CacheManager .Current.Expire(tag);
var rootCached = rep.AllIncluding(it => it.Items)
.Where(it => !it.ParentId.HasValue)
.FromCache(tags: new[] { tag })
.FirstOrDefault();
bool isOk = rootCached.Title == testRoot.Title;
古いバージョンがキャッシュから読み込まれます:
var rep = new CategoryRepository ();
var testRoot = rep.AllIncluding(it => it.Items)
.Where( Category.IsRootExpression)
.FirstOrDefault();
testRoot.Title = "test root " + DateTime .Now.ToLongTimeString();
rep.Save();
var tag = "test_tag" ;
CacheManager .Current.Expire(tag);
var rootCached = rep.AllIncluding(it => it.Items)
.Where( Category.IsRootExpression)
.FromCache(tags: new[] { tag })
.FirstOrDefault();
bool isOk = rootCached.Title == testRoot.Title;