제네릭 및 데이터베이스 액세스
-
06-07-2019 - |
문제
람다 표현식으로 전달하여 결과를 필터링 한 다음 결과 목록에서 작동하는 콜백 메소드가 있습니다. 이것은 내 시스템의 특정 테이블 일뿐입니다.이 구성을 계속해서 사용할 것입니다. 테이블을 매개 변수 (ADO.NET DataService 엔티티)로 가져와 필터 (Lambda Expersion)로 전달하는 일반적인 방법을 구축 할 수있는 방법.
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);
}
이것에 대한 나의 첫 번째 강타는 다음과 같습니다.
public delegate Action<List<Table>> DBAccess<Table>(Expression<Func<Table, bool>> filter);
해결책
LINQ에 ADO.NET DATASERVICES 또는 WCF DATASERVICES를 사용하는 경우 모델이 많은 유형을 구축합니다. 일반적으로 선택하고 필터링 할 것입니다. 다음이 필요합니다. 그러면 모든 방법은 이것의 맨 위에 사탕입니다.
쿼리 타입 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- 하나의 필터는 단일 엔티티를 반환합니다.
public void makeQuery (문자열 엔터티, 표현식> 필터, 액션 콜백) {
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
단일 및 목록 반품에 대해 반복합니다.
하나의 데이터 컨텍스트를 원한다면 이것을 싱글 톤에 묶거나 어떤 종류의 하이브리드 공장/싱글 톤에서 일련의 컨텍스트를 추적하면 멀리 떨어져 있습니다. 생성자가 컨텍스트를 취하거나 비 공급되는 경우 자체를 사용하면 멀리 떨어져 있습니다.
그런 다음 이것을 큰 선에서 사용하지만 한 곳에서 모두 사용합니다.
GenericQuery.Instance.Create().makeQuery<tblAgencyBranches>("tblAgencyBranches", f => f.tblAgencies.agencyID == _agency.agencyID, res => { AgenciesBranch.ItemsSource = res; });
이것은 복잡해 보일 수 있지만 많은 비동기 마법을 숨기고 특정 경우 버튼 핸들러에서 바로 호출 할 수 있습니다. 3 계층 시스템이 아니라 큰 시간 절약 장치입니다.