Frage

Ich habe folgende Methode, die ich in einem Lambda-Ausdruck passieren kann mein Ergebnis und dann eine Callback-Methode zu filtern, die auf der Liste der Ergebnisse arbeiten. Dies ist nur eine bestimmte Tabelle in meinem System, werde ich dieses Konstrukt immer und immer. Wie kann ich eine generische Methode baue aus, DBGet sagen, die eine Tabelle als Parameter (eine ADO.NET Data Einheit fair zu sein) und in einem Filter (eine Lambda-experssion) übergeben.

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

    }

Mein erster heftiger Schlag auf dies:

public delegate Action<List<Table>> DBAccess<Table>(Expression<Func<Table, bool>> filter);
War es hilfreich?

Lösung

Wenn Sie Linq to Ado.NET Dataservices oder WCF Dataservices verwenden, Ihr Modell bauen Sie viel getippt. Im Allgemeinen wenn Sie die Auswahl und Filterung werden. Sie müssen die folgende, dann werden alle Ihre Methoden nur Süßigkeiten über die Spitze hierfür sind:

Abfragetyp 1 - Ein Filter, gibt eine 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);

    }

Abfrage Typ 2 - Ein Filter, gibt eine einzelne Einheit:

public void makeQuery (string Einheit, Expression> Filter, Aktion Rückruf)         {

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

    }

Was Sie tun müssen, ist diese überlasten und den Filter tauschen für ein einfaches Array von Filtern

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

Und wiederholen Sie für einzelne und Liste zurückkehrt.

Bundle diese in ein Singleton, wenn Sie einen Datacontext mögen, oder halten Sie den Überblick über eine Reihe von Zusammenhängen in einer Art Hybrid-Fabrik / Singleton und Sie sind weg. Lassen Sie den Konstruktor einen Kontext nehmen oder, wenn nicht dann seine eigene geliefert werden, verwenden und Sie weg sind.

ich diese dann auf einer großen Linie verwenden, aber alles an einem Ort:

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

Das kann kompliziert aussehen, aber es verbirgt sich eine Menge async Magie, und in bestimmten Fällen können direkt aus den Button-Handler aufgerufen werden. Nicht so sehr ein 3-Tier-System, aber eine große Zeitersparnis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top