私の理解が正しければ、データソース用の単一のカスタム LINQ プロバイダーと、キャッシュされた結果を取得する (おそらくタイプ セーフな) 方法があります。
この場合、LINQ to Objects を使用してキャッシュ セットにアクセスすることをお勧めします。AsEnumerable
カスタム LINQ プロバイダーから LINQ to Objects に "ステップ アウト"するために使用できます。
join
ただし、問題が発生します。これらのタイプのいずれかがキャッシュに存在する可能性があるため、ロジックを DB にプッシュすることはできません。たとえば、 をAccountTransaction
キャッシュに入れずにキャッシュに入れることは可能Account
ですか?
キャッシュ内の状況を許可する場合 (AccountTransaction
関連付けられAccount
たレコードがない場合など)、db ではなくメモリ内で結合を行う必要があります。
var allDebitAccountTransactions = Session.GetAllCached<AccountTransaction>()
.Where(x => x.DebitAmount >= 0)
.Union(Session.CreateLinq<AccountTransaction>()
.Where(x => x.DebitAmount >= 0));
var allAccounts = Session.GetAllCached<Account>()
.Union(Session.CreateLinq<Account>());
var query3 = from c in allDebitAccountTransactions
join a in allAccounts where c.Account equals a
select new { a.Name, c.DebitAmount };
ただし、キャッシュをより細かく制御しAccountTransaction
、関連付けられたAccount
オブジェクトが存在する場合にのみオブジェクトの存在を許可する場合は、操作をデータソースにプッシュしjoin
、メモリ内で別の操作を実行して、結果をマージできます。
var datasourceResults = from c in Session.CreateLinq<AccountTransaction>()
join a in Session.CreateLinq<Account>() on c.Account equals a
where c.DebitAmount >= 0
select new { a.Name, c.DebitAmount, c.Id };
var cacheResults = from c in Session.GetAllCached<AccountTransaction>()
join a in Session.GetAllCached<Account>() on c.Account equals a
where c.DebitAmount >= 0
select new { a.Name, c.DebitAmount, c.Id };
var query3 = cacheResults.Union(datasourceResults)
.Select(x => new { x.Name, x.DebitAmount });
おもう。私はLINQ の専門家ではないので、他の回答を知りたいと思っています。