0

プロジェクトを維持しているだけです。C# 3.0 で記述されています。一部の実装では、コレクションを IQueryable として返します。

お気に入り

List<BookData> data = new List<BookData>();
   ...

   data.Add(new BookData { ID = "P001", BookTitle = "C# in Depth" });
   data.Add(new BookData { ID = "P002", BookTitle = "F# in Depth" });

    public IQueryable GetBooks()
    {
        return data.AsQueryable();
    }

コードはコレクション リストを返します。それらを AsQueryable として返すことの特別な点は何ですか?

4

2 に答える 2

0

リフレクションを使用したり、返されたオブジェクトをキャストしたりしない場合、返されたコレクションで使用できるメソッドは、インターフェイスによって定義されたメソッドのみです。これは、コレクションへのアクセスの種類を制限する 1 つの方法です。たとえば、IQueryable には add メソッドがありません。残念ながら、これはあなたのコードの「敵対的な」ユーザーに対して安全ではありません。コレクションを不可侵にする必要がある場合は、実際のコレクションを別のインターフェイスとしてキャストするのではなく、コレクションの読み取り専用コピーを返すことをお勧めします。

あなたの例のように、リスト、または実際に IQueryable をネイティブに実装する他のクラスを想定していることに注意してください。この場合、ソース オブジェクトが返されます。基になるオブジェクトが IQueryable を実装していない場合は、基になる IEnumerable への呼び出しをプロキシする IQueryable が返されます。

于 2009-12-20T20:25:32.193 に答える
0

のような単純な古いコレクションで呼び出された場合、AsQueryable は実際には何もしないList<T>ため、答えはおそらくコードベースの別の部分に依存します。たとえば、IQueryable<Book>GetBooks メソッドが LINQ プロバイダーを介してデータベース内で任意の順序付けまたはフィルター処理を実行することを意図して、GetBooks メソッドを定義して を受け取る可能性があります。しかし、あなたが見ているコードは、書籍のセットをList<Book>クエリではなくコレクション (a) として構築します。結果が架空の GetBooks メソッドに渡されるようにするには、コレクションを でラップする必要がIQueryable<Book>ありますが、そのラッパーは、(GetBooks 操作を SQL クエリに変換するのではなく) LINQ to Objects メソッドに直接デリゲートするだけです。 .

または、見ているクラスが、見ているメソッドが戻ると宣言されているインターフェイスを実装している可能性がありIQueryable<Book>ます (上記と同様の理由で)。したがって、コードはList<Book>、インターフェイス シグネチャとの互換性を維持するために をラップする必要があります。

于 2009-12-20T20:26:10.437 に答える