dataContext.getTable ()を使用して「QueryProvider」を取得する
-
28-09-2019 - |
質問
dataContext.getTable()メソッドは、タイプのオブジェクトを返します。
System.data.linq.table
それを行うことで、テーブル全体を取得するためにデータベースに電話をかけていないと思います。それ以外の場合、LINQはやや非効率的です。
したがって、私がやったのは、強力に型付けされたDataContextクラス(dbdatacontextなど)にドリルして、たとえばSQL Serverの顧客テーブルを表す「顧客」プロパティなどのハンドルをつかむことだけです。
その後、getTable()によって返されたオブジェクトからiQueryableを取得できますが、それでもデータベースにヒットしていません。つまり、私の「サービスレイヤー」コードは、linqからsqlではなくオブジェクトにlinqになります。
これをすべて行うことで、必要なリポジトリの数を減らします。
質問:
上記の仮定は正しいですか?
ノート:
私は、インターフェイスとジェネリックを使用してクエリを構築して、テスト可能にし、そのすべてのドゥーダを作成する方法を見つけようとしています。
だから、 @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データベース変数に相当するものを取得するには、ラッパーインターフェイスを作成する必要があると思います。
ただし、問題は上記の問題であり、この他の問題ではありません。私が言うように、私はここで学んでいます。この映画では、生産コードは傷つけられません。
解決
あなたの質問に対する簡単な答えは、あなたの仮定が正しいということです。介してデータベースにアクセスしません GetTable<>()
の方法 DataContext
. 。そして、あなたが得るとき IQueryable
また、データベースを列挙するまでデータベースにアクセスしません。
また、これがあなたの探求に役立つかどうかを確認してください: 各オブジェクトの一般的なリポジトリと特定のリポジトリを作成する利点はありますか?