سؤال

ولدي الأسلوب التالي I يمكن أن تمر في التعبير امدا لتصفية نتيجتي ثم طريقة الاستدعاء التي ستعمل على قائمة النتائج. هذا هو واحد فقط جدول معين في نظام بلدي، وأنا سوف تستخدم هذه التركيبة مرارا وتكرارا. كيف يمكنني بناء من طريقة عام، ويقول DBget أن يأخذ جدول كمعلمة (كيان ADO.NET dataservice لكي نكون منصفين) وتمر في فلتر (أ experssion امدا).

 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 - ومرشح واحد، يعود كيان واحد:

والجمهور الفراغ 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

وتكرار للعودة واحدة والقائمة.

وربطة هذا إلى المفرد إذا كنت تريد datacontext واحد، أو تتبع مجموعة من السياقات نوعا من الهجين مصنع / المفرد وكنت بعيدا. السماح للمنشئ تأخذ السياق أو إذا تم توفيره غير ثم استخدام تلقاء نفسها، وكنت بعيدا.

وبعد ذلك استخدام هذه على خط كبير ولكن في مكان واحد:

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

وهذا قد تبدو معقدة لكنها تخفي الكثير من السحر المتزامن، وفي بعض الحالات يمكن أن يسمى مباشرة من معالجات زر. وليس ذلك بكثير على نظام 3 طبقات، ولكن الوقت المدخر ضخمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top