1

我正在使用 Entity Framework 5.0,表达式 在 LINQ-to-Entities 中的建议类型成员支持中进行了描述?

public static Expression <Func <Category , bool >> IsRootExpression
{
get
{
    return p => p!= null && !p.ParentId.HasValue;
}
}

在我开始使用“实体框架扩展库”中的缓存之前,一切都运行良好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

0

因为您使用的是表达式,所以它是查询的一部分,也可能成为编译查询的一部分。这就是我看到缓存链接的地方。

如果您改为定义方法:

public static Func<Category,bool> IsRootSelector
{
   get { return p => p!= null && !p.ParentId.HasValue; }
}

您不应该遇到任何缓存问题,就像在您的第一个示例中一样。

于 2014-05-05T14:54:15.163 回答