2

GetObject、UpdateObject、DeleteObjectなどのメソッドを使用してMVCアプリケーションのリポジトリレイヤーを構築しています。

これは私が今持っているものです:

        public List<Object> GetObjects()
        {
            return _db.Objects.Where(o => o.IsArchived == false).ToList();
        } 

しかし、UoW層またはサービス層にフィルターが適用されたときにクライアントに送信されるデータの量が最小になるように、リストのIQueryablesを返す方がよいかどうか疑問に思っています。このようなことをするのが最善でしょうか?

            public IQueryable<Object> GetObjects()
            {
                return _db.Objects.Where(o => o.IsArchived == false);
            } 
4

2 に答える 2

1

IQueryable を返すことの良くない点は、異なる ORM を使用し、非 SQL データベース、クラウド、または XML ファイルにデータを格納するなど、リポジトリの実装が異なる場合、同じインターフェイスを実装するのが難しいことです。ドメイン オブジェクトのより一般的なコレクションを返すと、実装がはるかに簡単になります。たとえば、IEnumerable です。いつでもフィルタリング基準を渡すことができます。

IQueryable を返すことのもう 1 つの欠点は、実際にクエリを実行したときに、オブジェクト コンテキストが既に破棄されている (実装によっては) か、必要以上に長くメモリに保持される可能性があることです。

たとえば、データベースからデータを取得し、Guid で並べ替えたいとします。並べ替えの前に呼び出すことによってクエリを列挙するとToList()、後で行うと異なる結果が得られます。その理由は、最初のケースではソートが .NET で行われますが、別のケースではまったく異なる順序を使用する SQL で行われるためです。

于 2013-03-24T02:48:53.667 に答える
0

ここで IQueryable を返すことの良い点は、データベースにアクセスすることなくクエリをさらに構築し続けることができることです。ToList を呼び出すと、データベースにヒットし、データベースにもう一度ヒットしない限り、クエリをさらにカスタマイズすることはできません。

于 2013-03-24T02:27:30.653 に答える