سؤال

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

أولا، اسمحوا لي أن أذكر أن ايم خلق التطبيق .NET3.5 WinForms عناصر باستخدام C # و Plinqo (والمهنية LINQ إلى كائنات) كما بلدي ORM. من هنا وضعي: لدي داتاغريدفيف أن يتم ملؤها من SortableBindingList<T> - في حالتي، تشكلت من List<Task> التي تتمثل ببساطة كما يلي:

public class Task {
    public long TaskID { get; set; }
    public string TaskDescription { get; set; }
    public enumPriority TaskPriority { get; set; }
    public DateTime DueDate { get; set; }
    public double PercentageComplete { get; set; }
}  

و
الآن، أريد أن توفير حوار للمستخدم بلدي السماح له / لها لتصفية هذه القائمة. أتصور يمر في قائمة أسماء الملكية ونوع البيانات المرتبطة في الحوار الذي يمكنني استخدامها لتعبئة تحرير وسرد. وبالتالي فإن المستخدم اختيار أي الممتلكات التي تريد الاستعلام من تحرير وسرد واستنادا إلى التحديد ستبذل comparers المناسب والسيطرة UI متاح للمستخدم أن يدخل في معايير ثير. وأخيرا، وسوف تحتوي على AND / OR togglebutton في نهاية التي يمكن استخدامها للمستخدم إضافة معيار إضافي. وسيكون لكل معيار أن يكون كائن من نوع FilterItem كما هو مبين أدناه:

public class FilterItem {
    public string MappedPropertyName { get; set; }
    public enumComparer Comparer { get; set; }
    public object FilterValue { get; set; }
    public enumOpertor Operator { get; set; }
}

و
بعد يبني المستخدم له / لها الاستعلام، أنوي أن يمر هذا بمثابة List<FilterItem> إلى شكل الدعوة لي، والتي يمكن بعد ذلك تكرار من خلال القائمة واسمحوا لي لتصفية List<Task> الأصلي.

وهذا هو كل شيء على ما يرام، وشيء أستطيع أن وضع جنبا إلى جنب مع سهولة. ولكن أريد أن تأكد من أن آلية مرشح حالي أذهب مع وكما كتبته بقوة قدر الإمكان، وعدم استخدام بوليت تصل سلاسل مثل في مكتبة سؤال الحيوي. (كنت تفعل شيئا من هذا القبيل سابقا مع ADO.NET، DataViews وبناء سلسلة RowFilter حيوي)

ولقد قرأت حتى على PredicatBuilder و <لأ href جوسيف البهاري ل= " http://tomasp.net/blog/dynamic-linq-queries.aspx "يختلط =" نوفولو noreferrer "> مقال عن tomasp.net ، ولكن يبدو لي الخلط بشكل كبير معها وأشجار التعبير بشكل عام.

وأسعى بصدق مساعدتكم في مساعدتي على فهم أفضل لهذه المفاهيم، وكيفية التوجه نحو استخدامه حتى أن بلدي الهندسة المعمارية المقصود يمكن أن تعمل معها.

والكثير من التقدير!

هل كانت مفيدة؟

المحلول

وبالإضافة إلى ذلك، أعرف أنني أستطيع أن أفعل شيئا مثل:

private SortableBindingList<Task> GetSortedTaskList()
{
        List<Task> list = new List<Task>();
        var query = DataUtil.GetUserTasks(xSys.Current.UserID);
        if (/*description condition met*/)
        {
            query = query.Where(x => x.TaskDescription.Contains(FilterDesc));
        }
        if (/*due date condition met*/)
        {
            query = query.Where(x => x.DueDate >= FilterDate);
        }
        if (/*priority condition met*/)
        {
            query = query.Where(x => x.TaskPriority == FilterPriority);
        }

    ...

        list = query.ToList();
        return new SortableBindingList<ArcTask>(list);
}

و
ولكن هذا لا يبدو قابلة للغاية و "ديناميكية".

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