0

次のようなLinqクエリがあります

var query3 = 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 }
;

Session オブジェクトは、バックグラウンドでデータソースと対話しますが、内部にキャッシュされた状態もあり、変更される可能性があります。クエリを実行すると、内部キャッシュ状態とデータソースの両方をクエリし、結果をマージして、内部キャッシュ状態が優先されます。

正常に動作しているデータソースに対するクエリの生成に re-linq を使用しています。私がよくわからないのは、同じLinqクエリを使用して内部状態に対してクエリを実行する方法です。

内部状態を照会したいだけの場合は、Session.CreateLinq の代わりに使用できる Session の GetAllCached() 呼び出しがあります。しかし、カスタム プロバイダーのどの時点で GetAllCached() を使用してデータソースと内部状態へのハンドオフを処理できるかわかりません。

Linq の達人からの提案を歓迎します。

4

2 に答える 2

2
        // From Database
        var query1 = from c in Session.CreateLinq<AcccountTransaction>()
                     join a in Session.CreateLinq<Account>()
                     on c.Account equals a
                     where c.DebitAmount >= 0
                     select new { Account = a, AccountTrans = c };
                     //select new { a.Name, c.DebitAmount }; 

        // From Cache
        var query2 = from c in Session.GetAllCached<AcccountTransaction>()
                     join a in Session.GetAllCached<Account>()
                     on c.Account equals a
                     where c.DebitAmount >= 0
                     select new { Account = a, AccountTrans = c };
                     //select new { a.Name, c.DebitAmount };   



        //var query3 = query2.Union(query1.Except(query2));
        var query4 = query2.Union(query1);

変更:04:51AMシンガポール時間

于 2010-06-18T18:47:09.053 に答える
1

私の理解が正しければ、データソース用の単一のカスタム 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 の専門家ではないので、他の回答を知りたいと思っています。

于 2010-06-18T17:26:04.807 に答える