1

私は 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;
4

1 に答える 1