Genéricos e Access Database
-
06-07-2019 - |
Pergunta
Eu tenho o seguinte método que eu possa passar em uma expressão lambda para filtrar meu resultado e, em seguida, um método de retorno que irá trabalhar na lista de resultados. Esta é apenas uma tabela em particular no meu sistema, vou usar esta construção mais e mais. Como posso construir um método genérico, dizem DBget que leva uma tabela como um parâmetro (entidade DataService Um ADO.NET para ser justo) e passar em um filtro (a experssion lambda).
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);
}
A minha primeira festa para isto é:
public delegate Action<List<Table>> DBAccess<Table>(Expression<Func<Table, bool>> filter);
Solução
Se você estiver usando Linq para Ado.NET DataServices ou WCF DataServices, o modelo vai construir um monte de digitado. Geralmente embora você estará selecionando e filtragem. Você precisa o seguinte, em seguida, todos os seus métodos são apenas doces por cima deste:
Consulta Tipo 1 - Um filtro, retorna uma lista:
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);
}
Consulta tipo 2 - um filtro, retorna uma única entidade:
makeQuery public void (entidade corda, Expression> filtro, callback Ação) {
IQueryable<T> query = plussContext.CreateQuery<T>(entity).Where(filter);
var DSQuery = (DataServiceQuery<T>)query;
DSQuery.BeginExecute(result =>
{
callback(DSQuery.EndExecute(result).First<T>());
}, null);
}
O que você precisa fazer é a sobrecarga estes e trocar o filtro para um simples conjunto de filtros
Expression<Func<T, bool>>[] filter
e repita para retornos individuais e lista.
Bundle isso em um singleton se você quiser um datacontext, ou manter o controle de uma variedade de contextos em algum tipo de híbrido fábrica / Singleton e você estiver ausente. Deixe o construtor tomar um contexto ou se não são fornecidos em seguida, usar o seu próprio e você estiver ausente.
Eu, então, usar isso em uma grande linha mas todos em um só lugar:
GenericQuery.Instance.Create().makeQuery<tblAgencyBranches>("tblAgencyBranches", f => f.tblAgencies.agencyID == _agency.agencyID, res => { AgenciesBranch.ItemsSource = res; });
Isto pode parecer complicado, mas ele esconde um monte de magia assíncrona, e em certos casos pode ser chamado diretamente dos manipuladores de botão. Não tanto um sistema de 3 camadas, mas uma enorme poupança de tempo.