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 データベース変数と同等のものを取得するには、ラッパー インターフェイスを作成する必要があると思います。
ただし、問題は上記の問題であり、この他の問題ではありません。私が言うように、私はここで学んでいます。このムービーでは、製品コードが損なわれることはありません。