1

リポジトリ パターンを使用し、IQueryable を返す遅延ロードされた GetAll メソッドを使用してデータベースからオブジェクトをプルする状況があります。ただし、遅延読み込みオブジェクト (クエリ) に含まれる動的オブジェクトも作成する必要があります。

ビルドされたオブジェクトを遅延ロードされた IQueryable に追加し、遅延ロードの利点を維持することは可能ですか? 例えば

public override IQueryable<Foo> GetAll()
{
    return _entities; // lazy loaded
}  

public override IQueryable<Foo> GetAllPlusDynamic()
{
    var entities = GetAll(); 
    foreach(var d in GetAllDynamic())
    {
        entities.Add(d); // eagerly loaded
    }
    return entities;
}
4

1 に答える 1

1

私はあなたを正しく理解しているかどうかわかりませんが、あなたのコメントを参照してください...

はい、基本的には、一連のオブジェクトについてデータベースにクエリを実行してから、別のデータ ソース (この場合はサービス) にクエリを実行して、一連のオブジェクトを構築します。

... ありえないと思います。

Entity Framework (LINQ to Entities) で使用される型のオブジェクトは、IQueryable<T>基本的に、基になるデータ ストアが実行できるクエリの記述であり、通常は SQL に変換される抽象的な記述 (式ツリー) です。

このようなクエリ記述のすべての部分 (where式、select式、Any(...)式など) は、データ ストアのネイティブ言語 (SQL) に翻訳可能である必要があります。データベースが理解および実行できない式に、いくつかのメソッド呼び出し (サービス呼び出しなど) を含めることは特に不可能です。

IQueryable<T>基礎となる「プロバイダー」を知っています。このプロバイダーは、オブジェクトが保持する式ツリーIQueryable<T>を「何か」に変換する役割を果たします。たとえば、SQL Server で使用される T-SQL や、MySQL または Oracle で使用される SQL 方言などです。サービス呼び出しとデータベース クエリを実行できる独自のプロバイダーを作成することは可能だと思います。しかし、これは簡単な仕事ではないと私は信じています。

Entity Framework の標準 SQL プロバイダーを使用して、データベース クエリを実行し、サービスを個別に呼び出す必要があります。クエリを実行し、メモリ内のエンティティを具体化してから、各エンティティの結果コレクションでサービス呼び出しを実行します。

于 2012-06-23T11:20:16.093 に答える