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);
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top