3

DataContext.GetTable() メソッドは、次のタイプのオブジェクトを返します。

System.Data.Linq.Table

そうすることで、テーブル全体を取得するためにデータベースへの呼び出しを発行していないと思います。そうしないと、LINQ はやや非効率的になります。

したがって、厳密に型指定された Datacontext クラス (dbDataContext など) にドリルダウンして、SQL Server の Customers テーブルを表す "Customers" プロパティなどのハンドルを取得するだけです。

その後、GetTable() によって返されたオブジェクトから IQueryable を取得できますが、データベースにはヒットしていません。つまり、私の「サービス レイヤー」コードは、Linq to Sql ではなく、LINQ to Objects になります。

これをすべて行うことで、必要なリポジトリの数を減らします。

質問:

上記の仮定は正しいですか?

ノート:

インターフェイスとジェネリックを使用してクエリを作成し、テスト可能にする方法を見つけようとしています。

したがって、@zowenの応答に沿って考えてください:

リポジトリ パターン: エンティティごとに 1 つのリポジトリ クラス?

実装しようとしています

public interface IQueryProvider<T>
{
     TResult Query<TResult>(Func<IQueryable<T>, TResult> query);
}

厳密には必要ではないことはわかっていますが、学習曲線をたどり、自分に合ったアーキテクチャ オプションと自分の考え方を調べています。

私がやろうとしていること:

MongoDb の代わりに SQL Server に以下を実装しようとしています。

public class MongoQueryProvider<T> : IQueryProvider<T>
{
    private readonly IMongoCollection<T> collection;

    public MongoQueryProvider(IMongoDatabase database)
    {
        this.collection = database.GetCollection<T>();
    }

    public TResult Query<TResult>(Func<IQueryable<T>, TResult> query)
    {
        return query(this.collection.Linq());
    }
}

私が望むのは、GetTable() のハンドルを取得し、それに対してサービス レイヤー Linq コードを記述することです。

IMongoDatabase データベース変数と同等のものを取得するには、ラッパー インターフェイスを作成する必要があると思います。

ただし、問題は上記の問題であり、この他の問題ではありません。私が言うように、私はここで学んでいます。このムービーでは、製品コードが損なわれることはありません。

4

1 に答える 1

4

あなたの質問に対する簡単な答えは、あなたの仮定が正しいということです。GetTable<>()の方法でデータベースにアクセスすることはありませんDataContext。また、取得するIQueryableと、データベースを列挙するまでデータベースにアクセスしません。

また、これがあなたの探求に役立つかどうかを確認してください: オブジェクトごとに汎用リポジトリと特定のリポジトリを作成する利点は?

于 2010-11-26T21:14:40.890 に答える