以下方法在我的服务层中正常运行:
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;
}
问题是什么?如何解决? 如何在此示例中使用本地方法并将新数据重新加载到本地(缓存)?
答案 0 :(得分:1)
你正在看错了问题。您最有可能看到的是,当您执行第一个查询时,本地缓存为空。因此它只返回查询结果。但当你做第二个时,它会返回你的第一个查询和第二个查询的结果。
这归结为您在所有方法之间使用共享DbContext的事实。 Local包含上下文检索的所有记录的缓存,而不仅仅是最新的查询。
正确的解决方案是不要以这种方式使用Local。更好的是,不要使用共享上下文,因为这会导致上下文缓存膨胀。
答案 1 :(得分:0)
我不太确定你在这里使用.Load方法想要实现什么,但似乎你想要以下内容。
public override IList<City> GetAll(Func<City, bool> predicate)
{
return _tEntities.Where<City>(predicate).ToList();
}
答案 2 :(得分:0)
query.Where<City>(predicate);
这不会改变query
。下一行的query.Load()
会忽略谓词:您正在调用query.Load()
而不是query.Where<City>(predicate).Load()
。这就像你写的那样
int i = 3; i + 1; Console.WriteLine(i); // still prints 3
在该示例中,C#实际上并不真正允许将添加用作语句,但.Where(predicate)
是方法调用,并且方法调用可以这样使用,即使它们返回值。
这不是你唯一的问题(请参阅其他答案),但我的猜测是,这个问题导致了你所看到的意外结果。