以下方法在我的服务层中正常工作:
public override IList<City> GetAll()
{
var query = from item in _tEntities
select item;
query.Load();
return _tEntities.Local;
}但是当我尝试运行下面的方法时,该方法返回由GetAll()方法加载的旧数据。
public override IList<City> GetAll(Func<City, bool> predicate)
{
var query = from item in _tEntities
select item;
query.Where<City>(predicate);
query.Load();
return _tEntities.Local;
}问题出在哪里?我该如何解决它们?
如何在此示例中使用本地方法并将新数据重新加载到本地(缓存)?
发布于 2013-02-16 07:50:17
你看错问题了。您最可能看到的是这样一个事实:当您执行第一个查询时,本地缓存是空的。因此,它只返回查询的结果。但当您执行第二个查询时,它将返回第一个查询和第二个查询的结果。
这归根结底是因为您在所有方法之间使用了共享的DbContext。Local包含上下文检索到的所有记录的缓存,而不仅仅是最近的查询。
正确的解决方案是不以这种方式使用Local。更好的是,不要使用共享上下文,因为这会导致上下文缓存膨胀。
发布于 2013-02-16 07:48:32
我不太确定您在这里尝试使用.Load方法来实现什么,但似乎您需要以下内容。
public override IList<City> GetAll(Func<City, bool> predicate)
{
return _tEntities.Where<City>(predicate).ToList();
}发布于 2013-02-16 08:01:42
query.Where(谓词);
这不会改变query。下一行上的query.Load()忽略了谓词:您调用的是query.Load(),而不是query.Where<City>(predicate).Load()。就好像你写了
int i= 3;i+ 1;Console.WriteLine(i);//仍打印3
在这个示例中,C#实际上并不允许将加法用作语句,但是.Where(predicate)是一个方法调用,方法调用可以这样使用,即使它们返回值。
这不是你唯一的问题(请看其他答案),但我猜这个问题会导致你看到意想不到的结果。
https://stackoverflow.com/questions/14905198
复制相似问题