سؤال

بالنظر إلى الموظف ، كيف يمكنني بناء استعلام LINQ إلى SQL للعثور على جميع أسلاف الموظف؟ كل موظف لديه المشرف المرتبط (انظر أدناه).

على سبيل المثال ، يجب أن يعيد الاستعلام عن أسلاف الموظف 6 (فرانك بلاك) جين دو وبوب سميث وجو بلونغز ورئيس هونشو.

إذا لزم الأمر ، يمكنني تخزين قائمة جميع الموظفين لتحسين الأداء.

تحديث:

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

private List<Employee> GetAncestors(int EmployeeId)
{
    List<Employee> emps = new List<Employee>();
    using (L2STestDataContext dc = new L2STestDataContext())
    {
        Employee emp = dc.Employees.FirstOrDefault(p => p.EmployeeId == EmployeeId);
        if (emp != null)
        {
            while (emp.Supervisor != null)
            {
                emps.Add(emp.Supervisor);
                emp = emp.Supervisor;
            }
        }
    }
    return emps;
}
هل كانت مفيدة؟

المحلول

بادئ ذي بدء ، اهلا وسهلا بكم لاستخدام الاستعلامات الهرمية في بلدي مشروع طرق تمديد LINQ. أعتقد أنه قد يساعد في تبسيط الكود الخاص بك.

المشكلة هنا هي أن هذا سيقوم بإنشاء مكالمة قاعدة بيانات لكل عقدة في التسلسل الهرمي. في حالة مثالك ، سيكون لديك 5 رحلات مستديرة إلى قاعدة البيانات.

سأذهب إلى مسار مختلف وأقوم بإنشاء مخزنة لفعل ذلك من أجلي وإعادة المجموعة الكاملة من Employee أشياء. نظرًا لأنك تفصل الكائنات قبل إرجاعها (التخلص من السياق) ، يمكنك ببساطة إنشاء كائن جديد من مجموعة نتائج الإجراء المخزنة.

نصائح أخرى

الحل البسيط الذي يتجنب تحميل جدول الموظف بأكمله (ولكن له عمق اجتياز محدود) هو ...

var emps = dc.Employees.Where(e => (e.EmployeeId == EmployeeId) ||
                                   (e.SupervisorId == EmployeeId) ||
                                   (e.Supervisor.SupervisorId == EmployeeId) ||
                                   (e.Supervisor.Supervisor.SupervisorId == EmployeeId) ||
                                   ...);

في النهاية ، يجب عليك استخدام التعبير الجدول المشترك لتسوية التسلسل الهرمي ، لكن LINQ إلى SQL لا يدعم هذا حاليًا. يمكنك البحث في كتابة طريقة التمديد الخاصة بك (مثل طريقة في مكتبة Omer ولكن باستخدام iQueryable بدلاً من iEnumerable لدعم تنفيذ من جانب الخادم).

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