C # IQueryable - добавит другое измерение? - PullRequest
0 голосов
/ 20 декабря 2009

Просто я поддерживаю проект. Он был написан на C # 3.0. Некоторые реализации возвращают коллекцию как IQueryable.

как

List<BookData> data = new List<BookData>();
   ...

   data.Add(new BookData { ID = "P001", BookTitle = "C# in Depth" });
   data.Add(new BookData { ID = "P002", BookTitle = "F# in Depth" });

    public IQueryable GetBooks()
    {
        return data.AsQueryable();
    }

Код должен был вернуть список сбора. Что особенного в их возвращении как AsQueryable?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2009

AsQueryable на самом деле ничего не делает, когда вызывается из простой старой коллекции, такой как List<T>, поэтому ответ, вероятно, зависит от другой части кодовой базы. Например, кто-то, возможно, определил метод GetBooks для принятия IQueryable<Book> с намерением, чтобы метод GetBooks выполнял любое упорядочивание или фильтрацию в базе данных через поставщика LINQ. Но код, который вы просматриваете, создает набор книг как коллекцию (List<Book>), а не как запрос. Чтобы результат был передан гипотетическому методу GetBooks, коллекция должна быть обернута в IQueryable<Book>, даже если эта оболочка просто делегирует обратно методам LINQ to Objects (а не переводит операции GetBooks в SQL-запросы).

Или, возможно, класс, к которому вы обращаетесь, реализует интерфейс, в котором метод, к которому вы обращаетесь, объявлен как возвращающий IQueryable<Book> (по тем же причинам, что и выше), поэтому ваш код должен обернуть List<Book> в оставаться совместимым с подписью интерфейса.

0 голосов
/ 20 декабря 2009

Без использования отражения или приведения возвращаемого объекта, единственные методы, которые доступны в возвращенной коллекции, - это методы, определенные интерфейсом. Это было бы одним из способов ограничения некоторых типов доступа к коллекции - например, в IQueryable нет метода add. К сожалению, это не безопасно перед лицом «враждебного» пользователя вашего кода. Если вам действительно нужно, чтобы коллекция была неприкосновенной, лучшим способом будет вернуть копию коллекции, предназначенную только для чтения, а не фактическую коллекцию, приведенную в качестве другого интерфейса.

Обратите внимание, что я предполагаю List, как в вашем примере, или какой-то другой класс, который фактически реализует IQueryable изначально. В этом случае исходный объект возвращается. Если базовый объект не реализует IQueryable, то возвращается IQueryable, который передает вызовы базовому IEnumerable.

...