0

DBレイヤーがDTOオブジェクトのIQueryableを返すことを確認しました。LinqをサポートしているNHibernateを使用しています。ただし、問題は、DBレイヤーが終了したときにセッションを閉じる必要があるため、IQueryableが機能しなくなることです。ただし、SQL Serverでクエリが実行されないため、リストを返すこともできませんでした。

したがって、IQueryableを返し、Nhibernate LINQを使用して式を実行し、新しいIQueryableを返すことは可能ですか?

多分このようなもの:

public IQueryable<TagDTO> Tags
    {
        get
        {
            using (var session = factory.OpenSession())
            {
                return new ExceuteQueryable<TagDTO>(session.Query<TagDTO>());
                //return session.Query<TagDTO>();
            }
        }
    }

ExceuteQueryableは、式ツリーを使用してクエリを実行し、結果のリストを取得して、リストの新しいiqueryableを返す必要がありますか?

4

1 に答える 1

0

早期に実行することは、リストを返すことと同じです。データベース (セッション) への接続がなければ、どうすればクエリを実行できるでしょうか? このようにセッションを細かく管理しないでください。代わりに、ビジネス操作全体でセッションを使用/保持してください。クローズされたトランザクションに問題はありません。

DAL から IQueryable を返すと、データアクセスにはアクセスを最適化するためのコンテキストがまったくないため、思ったよりも早く問題が発生します (熱心なフェッチ、フィルタリング、複数回反復するための ToList())。また、一貫したキャッシングは、コンテキストなしではほぼ不可能です。

于 2013-02-19T07:41:08.683 に答える