Поддерживает ли Dynamic Linq BindingList <T>? - PullRequest
1 голос
/ 22 марта 2011

Вопрос

Я пытаюсь использовать Динамический образец Linq от Microsoft с BindingList<T> объектами.Но похоже, что Dynamic Linq будет работать только с IQueryable.В чем здесь дело, почему BindingList<T> не реализует IQueryable.И есть ли способ обойти это?


Справочная информация: У меня есть много наборов данных, которые мне нужно динамически фильтровать во время выполнения.Вот пример:

BindingList<MyObject> list = new BindingList<MyObject>();
MyObject selectedObj = list.FirstOrDefault(o => o.Name == "Master P")

// then later ...
MyObject selectedObj = list.FirstOrDefault(o => o.City == "Boston")

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

1 Ответ

0 голосов
/ 22 марта 2011

В BindingList есть метод Extension;AsQueryable ().Таким образом, вы можете использовать

list.AsQueryable();

Но если вы хотите выполнить поиск по всем критериям, вы можете создать поиск, который использует экземпляр MyObject в качестве критерия поиска, а затем сгенерировать набор результатов на основе критериев в объекте.используя стандартную ссылку.

Например:

public List<MyObject> Search(MyObject SearchCriteria)
    {
        BindingList<MyObject> list = new BindingList<MyObject>();
        list.Add(new MyObject("Test", "Boston"));
        list.Add(new MyObject("Test2", "Atlanta"));

        IEnumerable<MyObject> results = list.AsEnumerable();
        if (!String.IsNullOrEmpty(SearchCriteria.Name))
            results = results.Where(l => l.Name.Contains(SearchCriteria.Name));
        if (!String.IsNullOrEmpty(SearchCriteria.City))
            results = results.Where(l => l.City.Contains(SearchCriteria.City));
        return results.ToList();

    }

Таким образом, в дальнейшем у Results1 будет 2 результата, а у Results 2 - только 1.

List<MyObject> results1 = Search(new MyObject("Test", ""));
List<MyObject> results2 = Search(new MyObject("Test", "Boston"));

Iв качестве примера использовал простую структуру MyObject:

public class MyObject
{
    public MyObject(string name, string city)
    {
        this.Name = name;
        this.City = city;
    }
    public string Name { get; set; }
    public string City { get; set; }
}
...