ジェネリックとデータベースアクセス
-
06-07-2019 - |
質問
次のメソッドを使用して、ラムダ式を渡して結果をフィルタリングし、結果のリストで機能するコールバックメソッドを渡します。これはシステム内の特定のテーブルの1つに過ぎず、この構造を繰り返し使用します。汎用メソッドを構築するにはどうすればいいですか?DBgetがテーブルをパラメーターとして(ADO.NETデータサービスエンティティは公平に)、フィルター(ラムダ式)を渡すことができます。
public void getServiceDevelopmentPlan(Expression<Func<tblServiceDevelopmentPlan, bool>> filter, Action<List<tblServiceDevelopmentPlan>> callback)
{
var query = from employerSector in sdContext.tblServiceDevelopmentPlan.Where(filter)
select employerSector;
var DSQuery = (DataServiceQuery<tblServiceDevelopmentPlan>)query;
DSQuery.BeginExecute(result =>
{
callback(DSQuery.EndExecute(result).ToList<tblServiceDevelopmentPlan>());
}, null);
}
これで私の最初のbashは:
public delegate Action<List<Table>> DBAccess<Table>(Expression<Func<Table, bool>> filter);
解決
Linq to Ado.NET DataservicesまたはWCF Dataservicesを使用している場合、モデルにより多くの入力が作成されます。一般的には、選択してフィルタリングします。次のものが必要な場合、すべてのメソッドはこの上にキャンディーだけです:
クエリタイプ1-1つのフィルター、リストを返します:
public void makeQuery<T>(string entity, Expression<Func<T, bool>> filter, Action<List<T>> callback)
{
IQueryable<T> query = plussContext.CreateQuery<T>(entity).Where(filter);
var DSQuery = (DataServiceQuery<T>)query;
DSQuery.BeginExecute(result =>
{
callback(DSQuery.EndExecute(result).ToList<T>());
}, null);
}
クエリタイプ2-1つのフィルター、単一のエンティティを返します:
public void makeQuery(string entity、Expression&gt; filter、Action callback) {
IQueryable<T> query = plussContext.CreateQuery<T>(entity).Where(filter);
var DSQuery = (DataServiceQuery<T>)query;
DSQuery.BeginExecute(result =>
{
callback(DSQuery.EndExecute(result).First<T>());
}, null);
}
必要なのは、これらをオーバーロードし、フィルターをフィルターの単純な配列に交換することです
Expression<Func<T, bool>>[] filter
さらに、単一およびリストの戻り値についても繰り返します。
1つのデータコンテキストが必要な場合はこれをシングルトンにバンドルするか、何らかのハイブリッドファクトリ/シングルトンでコンテキストの配列を追跡し、離れています。コンストラクターにコンテキストをとらせるか、nonが提供されている場合はコンストラクターを使用してください。
次に、これを大きな行で使用しますが、すべて1か所で実行します:
GenericQuery.Instance.Create().makeQuery<tblAgencyBranches>("tblAgencyBranches", f => f.tblAgencies.agencyID == _agency.agencyID, res => { AgenciesBranch.ItemsSource = res; });
これは複雑に見えるかもしれませんが、多くの非同期マジックを隠しており、特定のインスタンスではボタンハンドラから直接呼び出すことができます。 3層システムではなく、時間を大幅に節約できます。