Создание динамического фильтра Linq над списком <T> - PullRequest
2 голосов
/ 27 ноября 2009

Хорошо, я задавал этот вопрос раньше, но удалил его, так как описал мою проблему неправильно.

Во-первых, позвольте мне заявить, что я создаю приложение .NET3.5 Winforms, используя C # и Plinqo (Professional Linq to Objects) в качестве моего ORM. Вот моя ситуация: у меня есть DataGridview, который заполняется из 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; }
}  


Теперь я хочу предоставить диалоговое окно для моего пользователя, чтобы позволить ему / ей фильтровать этот список. Я предполагаю передачу списка имен свойств и связанного DataType в диалог, который я могу использовать для заполнения ComboBox. Таким образом, пользователь будет выбирать, какое свойство он хочет запросить, из comboBox, и на основе этого выбора пользователю будут доступны соответствующие средства сравнения и пользовательского интерфейса для ввода в свои критерии. И наконец, в конце он будет содержать переключатель AND / OR, который пользователь может использовать для добавления дополнительного критерия. Каждый критерий будет объектом типа 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>.

Это все хорошо, и я могу с легкостью собрать это вместе. Но я хочу удостовериться, что механизм фильтра ACTUAL, с которым я работаю, максимально строгий типизированный, и не использует скрытые строки, как в Dynamic Query Library. (Раньше я делал нечто подобное с ADO.NET, DataViews и динамическим построением строки RowFilter)

Я прочитал статью PredicatBuilder и Джозефа Албахари на tomasp.net , но мне кажется, что она сильно смущена этим и деревьями выражений в целом.

Я искренне прошу вашей помощи, чтобы помочь мне лучше понять эти концепции и как использовать их так, чтобы моя предполагаемая архитектура могла работать с ними.

Большая благодарность!

1 Ответ

2 голосов
/ 27 ноября 2009

Кроме того, я знаю, что могу сделать что-то вроде:

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


но это не кажется очень масштабируемым и «динамичным».

...