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

あなたは間違った問題を見ています。最も可能性が高いのは、最初のクエリを実行したときにローカル キャッシュが空であるという事実です。したがって、クエリの結果のみが返されます。しかし、2 番目のクエリを実行すると、最初のクエリと 2 番目のクエリの結果が返されます。

これは、すべてのメソッド間で共有 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);

これは変わりませんquery。次のquery.Load()行の は述語を無視します: you're calling query.Load()and 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 に答える