0

以下方法在我的服务层中正常工作:

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;
       }

有什么问题,我该如何解决?
如何在此示例中使用本地方法并将新数据重新加载到本地(缓存)?

4

3 回答 3

1

您正在查看错误的问题。您最有可能看到的结果是,当您执行第一次查询时,本地缓存为空。所以它只返回查询的结果。但是当你做第二个时,它会返回你的第一个查询和你的第二个查询的结果。

这归结为您在所有方法之间使用共享 DbContext 的事实。Local 包含上下文已检索的所有记录的缓存,而不仅仅是最近的查询。

正确的解决方案是不要以这种方式使用 Local。更好的是,不要使用共享上下文,因为这会导致上下文缓存膨胀。

于 2013-02-15T23:50:17.000 回答
0

我不太确定你想用 .Load 方法在这里实现什么,但看起来你想要以下。

public override IList<City> GetAll(Func<City, bool> predicate)
{
    return _tEntities.Where<City>(predicate).ToList();
}
于 2013-02-15T23:48:32.083 回答
0
query.Where<City>(predicate);

这不会改变queryquery.Load()下一行的 忽略谓词:you're call and query.Load()not query.Where<City>(predicate).Load()。好像你写过

int i = 3;
i + 1;
Console.WriteLine(i); // still prints 3

在该示例中,C# 实际上并不允许将加法用作语句,而是.Where(predicate)方法调用,并且方法调用可以这样使用,即使它们返回值。

这不是您唯一的问题(请参阅其他答案),但我猜这个问题是导致您看到的意外结果的问题。

于 2013-02-16T00:01:41.923 回答