Question

J'ai la méthode suivante. Je peux passer une expression lambda pour filtrer mes résultats, puis une méthode de rappel qui fonctionnera dans la liste des résultats. Ceci est juste une table particulière dans mon système, je vais utiliser cette construction à plusieurs reprises. Comment puis-je construire une méthode générique, par exemple, DBget qui prend une table en tant que paramètre (une entité de service de données ADO.NET doit être juste) et passer un filtre (une expression 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);

    }

Ma première visite à ce sujet est la suivante:

public delegate Action<List<Table>> DBAccess<Table>(Expression<Func<Table, bool>> filter);
Était-ce utile?

La solution

Si vous utilisez Linq to Ado.NET Dataservices ou WCF Dataservices, votre modèle générera beaucoup de types de frappe. Généralement, vous sélectionnerez et filtrerez. Vous devez disposer des éléments suivants. Toutes vos méthodes ne sont que des bonbons:

Type de requête 1: un filtre, renvoie une liste:

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);

    }

Type de requête 2 - Un filtre, renvoie une seule entité:

make void public void (entité chaîne, expression > filtre, rappel d'action)         {

        IQueryable<T> query = plussContext.CreateQuery<T>(entity).Where(filter);
        var DSQuery = (DataServiceQuery<T>)query;
        DSQuery.BeginExecute(result =>
        {
            callback(DSQuery.EndExecute(result).First<T>());
        }, null);

    }

Ce que vous devez faire est de surcharger ceux-ci et d'échanger le filtre pour un simple tableau de filtres

Expression<Func<T, bool>>[] filter

Et répétez pour les retours simples et les retours à la liste.

Associez ceci à un singleton si vous voulez un seul contexte de données, ou gardez une trace d'un tableau de contextes dans une sorte de singleton factory / singleton et si vous êtes absent. Laissez le constructeur prendre un contexte ou si non sont fournis, utilisez le sien et vous serez absent.

J'utilise ensuite cela sur une grande ligne mais au même endroit:

GenericQuery.Instance.Create().makeQuery<tblAgencyBranches>("tblAgencyBranches", f => f.tblAgencies.agencyID == _agency.agencyID, res => { AgenciesBranch.ItemsSource = res; });

Cela peut paraître compliqué, mais cela cache beaucoup de magie asynchrone et, dans certains cas, il peut être appelé directement depuis les gestionnaires de boutons. Pas tellement un système à 3 niveaux, mais un énorme gain de temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top