EFコア拡張メソッド
NCache EF Core でクエリをキャッシュするための同期および非同期の拡張メソッドを提供します。同期 API は、 IQueryable
インターフェイス、非同期 API はこれらのメソッドのタスク インスタンスを返します。
Note
この機能は以下でも利用できます NCache Professional.
次のAPIを利用するには、アプリケーションに次の名前空間を含めます。
Alachisoft.NCache.EntityFrameworkCore
NCacheの Entity Framework Core Caching Provider には、クエリをキャッシュするための次の API が含まれています。
同期API | 非同期 API |
---|---|
FromCache |
FromCacheAsync |
LoadIntoCache |
LoadIntoCacheAsync |
FromCacheOnly |
FromCacheOnlyAsync |
FromCache
拡張メソッドは、(頻繁な読み取りおよび書き込み操作を伴う) トランザクション データを処理する場合に使用するのに理想的です。たとえば、フライト記録の維持では、それぞれの固有のフライトで新しいエントリを継続的にデータベースに記録する必要があります。あるいは、参照データ (読み取りが書き込みよりも頻繁に行われる場合) の場合は、次を使用します。 LoadIntoCache
および FromCacheOnly
拡張メソッド。製品カタログと同様に、製品はめったに変更されずデータベースから一貫して読み取られるため、参照データとして扱われます。これらの参照データ拡張メソッドを使用するには、アプリケーション内でクエリ インデックスを定義する必要があります。これは、 [QueryIndexable]
タグ。
EFCore を使用したキャッシュ データの保存
In FromCache
, LoadIntoCache
, FromCacheOnly
、およびそれに対応する非同期クエリでは、EF Core キャッシュ クエリを使用して、後続のクエリのためにデータをキャッシュに保存できます。
データをキャッシュに保存するには 2 つの方法があります。挿入呼び出しを使用して、データ セット全体をデータ ストア内の単一のキーに対するコレクションとして保存します。または、複数のキーに対して各エンティティを個別に一括で追加できます。 CachingOption を使用してこの選択を行うことができます。 StoreAs
に設定 StoreAs.Collection
or StoreAs.SeperateEntities
。指定して有効にすることができます bulkInsertChunkSize
かなりの数のエンティティ (例: 100,000) を扱う場合。これにより、データセットのサイズに関係なく、データがチャンクごとにキャッシュにロードされるようになり、データ ストレージ プロセスがより効率的で管理しやすくなります。
Note
bulkInsertChunkSize
プロパティは、エンティティの大部分を小さなチャンクに分割し、キャッシュをチャンクごとに更新します。そのため、90 秒の制限内でエンティティのチャンクをキャッシュし、キャンセル トークンのトリガーを防ぐことで、操作で接続タイムアウトを回避できます。デフォルトでは、 bulkInsertChunkSize
1000です。
重要
アプリケーションはバルク全体がキャッシュされて初めて応答を受信するため、大規模なデータセットを扱う場合は大幅な遅延を避けるために非同期拡張メソッドを使用することが最善です。
キャッシュから
FromCache
メソッドは、LINQ クエリに対して生成された結果セット データをキャッシュし、アプリケーションに返します。データがキャッシュに存在しない場合は、データ ソースから取得されてキャッシュに保存されます。アプリケーションが同じクエリを再度実行すると、必要なデータがキャッシュから取得され、データ ソースへの不必要なアクセスが回避されます。
ただし、この方法は 2 つのレベル (結果セット データの取得とキャッシュの更新) で実行されるため、特に後者の場合、失敗する可能性が高くなります。さまざまな理由により、キャッシュの更新に失敗する場合があります。たとえば、データベース接続の失敗、ネットワーク エラー、キャッシュ/サーバーのダウン、データのシリアル化の失敗、状態転送シナリオなどです。
したがって、 NCache を雇用しているユーザーに提供します FromCache
errorEnabled
このフラグを使用すると、結果セットに関連しない問題のためにアプリケーションを停止するかどうかを決定できます。一般に、キャッシュとシステム パフォーマンスが優先される場合、ユーザーはこのフラグを True に設定します (クエリは毎回データ ソースを処理するため、そうでない場合は)。ただし、優先順位によってアプリケーションが停止できない場合、ユーザーはこのフラグを False に設定します。
Note
デフォルトでは、 errorEnabled
フラグは False に設定されます。
Note
例え errorEnabled
フラグが False の場合、これらの更新キャッシュ関連の例外は、次の場所で入手可能なキャッシュ ログに記録されます。 %NCHome%/log-files
.
例
- 次の例では、指定された顧客 ID に基づいて顧客の詳細をデータベースから取得し、指定されたキャッシュ オプションを使用して別のエンティティとしてキャッシュに保存します。
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCache(options).ToList();
}
Note
を使用してキャッシュのアクティビティを監視することもできます。 NCache 監視します。
- 次の例では、キャッシュにコレクションとして保存されているクエリ結果セット データに対して内部的に生成されたキャッシュ キーを返します。このキーは、キャッシュからエンティティ/結果セットを削除するなど、将来の使用のために保存できます。
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.Collection
};
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCache(out string cacheKey, options);
}
Note
使用することにより、 エクスポート-CacheKeys 選択したツールで、特定のキャッシュのキャッシュ キーを表示できます。
FromCache に関する考慮事項
FromCache
は次の機能をサポートしています。
Group By
Order By Ascending
Order By Descending
Sum
Min
Max
Average
Count
Contains
Like
FirstOrDefault
これらの関数は、LINQ を使用しながら実装できます。 FromCache
、 次のように:
-
Like
EF Core の演算子は、文字列内のパターン マッチングを実行します。通常、それはWhere
inSELECT
ステートメントを使用して、列の値内の特定のパターンまたは部分文字列に基づいて行をフィルタリングします。さらに、ワイルドカードを使用して文字列内の 1 つ以上の文字と一致させることができます。
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(c => EF.Functions.Like(c.CompanyName, "Alfreds Futterkiste"))
.FromCache(options)
.ToList();
}
-
Contains
演算子は、Like
演算子は、指定された基準内でパターンベースの検索を使用します。
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCache(out cacheKey, options)
}
-
FirstOrDefault
演算子は以下のように実装できます。
using (var context = new NorthwindContext())
{
var result = context.Products
.Where(b => b.UnitPrice > 1)
.FromCache(out cacheKey, options)
.FirstOrDefault();
}
-
GroupBy
以下に実装されているように、FromCache のプロジェクションとともに使用できます。
using (var context = new NorthwindContext())
{
var resultSet = context.Products
.Where(p => p.UnitPrice == 10)
.GroupBy(p => p.ProductName)
.Select(group => group.Key)
.FromCache(out cacheKey, options)
.ToList();
}
キャッシュにロード
LoadIntoCache
API は結果セット データをソースからフェッチし、アプリケーションに返さずにキャッシュします。この API により、後続の FromCache
を呼び出して新しいデータを生成します。の LoadIntoCache
この方法は、顧客の注文などの頻繁に更新されるデータや支払い詳細などの機密データに特に適しています。このようなシナリオでは、古いデータを使用すると、不正なビジネス トランザクションが発生する可能性があるため、データの新しいコピーが常にキャッシュ内に存在する必要があります。この拡張メソッドは、データの完全な作業セットをキャッシュにロードします。次に、このメソッドはデータベースにクエリを実行し、結果をキャッシュに保存して、アプリケーションに返します。
例
- 次の例では、顧客の注文をデータベースから取得し、結果セットのデータをコレクションとしてキャッシュにロードします。また、将来の使用のために保存できる内部生成されたキャッシュ キーも返します。
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.Collection
};
var resultSet = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCache(out string cacheKey, options);
}
- 次の例では、指定されたキャッシュ オプションを使用して、特定の注文の詳細をデータベースから別のエンティティとしてキャッシュに読み込みます。
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var resultSet = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCache(options);
}
-
GroupBy
投影とともに使用できますLoadIntoCache
以下に実装されているように。
using (var context = new NorthwindContext())
{
var resultSet = context.Products
.Where(p => p.UnitPrice == 10)
.GroupBy(p => p.ProductName)
.Select(group => group.Key)
.LoadIntoCache(out cacheKey, options)
.ToList();
}
データの変更が予想されるときはいつでも、定期的にこのメソッドを実行できます。たとえば、1 週間以内にデータの変更が予想される場合、その期間後に再度実行すると、キャッシュ内のデータが確実に更新されます。
FromCacheOnly
顧客の詳細など、更新頻度が低いデータの場合、データ ソースから定期的に取得するとコストがかかります。 FromCacheOnly
キャッシュ内に存在するエンティティをクエリしますが、いかなる場合もデータ ソースには近づきません。基本的に、エンティティがキャッシュに存在しない場合でも、データ ソースからフェッチされることはありません。
Note
この API は、エンティティが個別に保存されている場合、つまりキャッシュ オプションの場合にのみ機能します。 StoreAs
に設定されています SeperateEntities
.
重要
エンティティにはインデックスを付ける必要があります。 NCache Management Center を使用する前に FromCacheOnly
.
- 次の例では、次の場合にキャッシュから顧客情報を取得します。 顧客 エンティティが存在します。 そうでない場合、返される結果セットは空になります。
using (var context = new NorthwindContext())
{
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheOnly();
}
FromCacheOnly に関する考慮事項
FromCacheOnly
集計関数をサポートします。ただし、これらの関数は結果のみをキャッシュし、エンティティ自体はキャッシュしません。したがって、 NCache 提供する QueryDeferred
キャッシュ内のエンティティがクエリに応じて結果を取得できるように、クエリを延期するメソッド。遅延 API の詳細については、次の章を参照してください。 クエリ遅延 API. FromCacheOnly
は次の機能をサポートしています。
Group By
Order By Ascending
Order By Descending
Sum
Min
Max
Average
Count
Contains
Like
LINQ を使用するときは、次の考慮事項に留意してください。 FromCacheOnly
:
を除いて
Count
、すべての集計関数は整数値を持つ必要があります。Count
カウントするエンティティを提供する必要があります。単一の LINQ 式
FromCacheOnly
複数の集計関数を使用することはできません。LINQ 式の射影は、次の場合にのみ実行できます。
GroupBy
演算子と集計関数は次の目的で使用されます。FromCacheOnly
.複数の投影はサポートされていません。 LINQ 式で投影できる (継承される) 属性は 1 つだけです。
using (var context = new NorthwindContext())
{
var result = context.Employees
.Select(e => e.EmployeeId) // Multiple projections have not been performed
.GroupBy(eid => eid) // eId was projected so GroupBy had to be used
.DeferredMin() // MIN provided with a numeric attribute
.FromCacheOnly();
}
GroupBy
これは主に集計関数 (列を使用してクエリの結果をグループ化する) に使用され、射影が事前に完了していて集計関数が使用されている場合にのみ使用できます。GroupBy
次の場合を除き、LINQ 式の最後の演算子でなければなりません。OrderBy
使用されている。このような場合、GroupBy
関数は前方にシフトできます(後)OrderBy
) または逆方向 (前OrderBy
).
using (var context = new NorthwindContext())
{
var result = context.Products
.Where(data => data.ProductName == "Tofu")
.GroupBy(data => new { data.ProductName})
.Select(group => new
{
_String = group.Key.ProductName,
Count = group.Count()
})
.FromCacheOnly();
}
OrderBy
(昇順と降順の両方) は、LINQ 式でのみ使用できます。FromCacheOnly
、もしGroupBy
使用されている。複数の
GroupBy
およびOrderBy
演算子は単一の LINQ 式で使用できません。FromCacheOnly
.結合はサポートされていないため、
Include()
という方法は機能しません。を含む LINQ 式の場合、
DateTime
インスタンスでは、キャッシュ クラスター内のすべてのノードが同じものを持っている必要がありますDateTime
フォーマットが設定されています。そうしないと、フォーマット例外が発生します。この問題は次の場合に発生します。DateTime.Now
およびDateTime.Parse()
メソッドはマルチノード キャッシュ クラスターで使用されます。それを回避するには、DateTime
両方のマシンでフォーマットします。さらに、使用DateTime.ParseExact()
がDateTime.Parse()
として、ParseExact()
API により、ユーザーによる形式の指定が制限されます。DateTime
.Like
EF Core の演算子は、文字列内のパターン マッチングを実行します。通常、それはWhere
inSELECT
ステートメントを使用して、列の値内の特定のパターンまたは部分文字列に基づいて行をフィルタリングします。さらに、ワイルドカードを使用して文字列内の 1 つ以上の文字と一致させることができます。
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(c => EF.Functions.Like(c.CompanyName, "Alfreds Futterkiste"))
.FromCacheOnly()
.ToList();
}
-
Contains
演算子は、Like
演算子は、指定された基準内でパターンベースの検索を使用します。
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCacheOnly()
}
-
Contains
演算子を使用して辞書を検索することもできます。
using (var context = new NorthwindContext())
{
var customerList = new List<string> { "CustomerId", "Alfreds Futterkiste" };
var result = context.Customers
.Where(b => customerList.Contains(b.CompanyName))
.FromCacheOnly();
}
非同期 LINQ API
非同期 API は、対応する同期 API と同じ機能を備えていますが、動作は非同期です。これらのメソッドに渡されるパラメータも同じです。
重要
非同期の性質により、 cacheKey
は、次のような非同期呼び出しでは返されません。 FromCacheAsync
および LoadIntoCacheAsync
- なので out
パラメータは、非同期シグネチャを持つメソッドでは使用できません。
FromCacheAsync
キャッシュ接続の確立に失敗した場合、データはデータベースから直接フェッチされます。ただし、リクエストが行われてから 60 秒ごとに、キャッシュ接続が再試行されます。後続のリクエストは、最後のリクエストから 60 秒後にキャッシュの再初期化を試みます。接続が正常に確立されると、データがキャッシュからフェッチされます。
次の例では、指定された情報に基づいて顧客の詳細を取得します。 顧客ID データベースから非同期的に取得され、指定されたキャッシュ オプションを使用してキャッシュ内の別個のエンティティとして保存されます。
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheAsync(options);
task.Wait();
var resultSet = task.Result.ToList();
}
LoadIntoCache非同期
次の例では、指定されたキャッシュ オプションを使用して、特定の注文の詳細をデータベースから別のエンティティとしてキャッシュに読み込みます。
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCacheAsync(options);
task.Wait();
var resultSet = task.Result.ToList();
}
FromCacheOnlyAsync
次の例では、顧客情報がキャッシュからのみ取得されます。 顧客 エンティティが存在します。そうでない場合、データベースは無視されるため、返される結果セットは空になります。
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheOnlyAsync();
task.Wait();
var resultSet = task.Result.ToList();
}
も参照してください
。ネット: Alachisoft.NCache.EntityFrameworkCore 名前空間
。ネット: Alachisoft.NCache.ランタイム.キャッシュ 名前空間