Можете ли вы выполнять запросы, подобные LINQ, на таком языке, как Python или Boo?

StackOverflow https://stackoverflow.com/questions/117732

Вопрос

Примите это просто C # LINQ запросите и представьте, что db.Numbers является SQL таблица с одним столбцом Number:

var result = 
    from n in db.Numbers
        where n.Number < 5
        select n.Number;

Это будет работать очень эффективно в C#, потому что это порождает SQL запросите что-то вроде

select Number from Numbers where Number < 5 

Что это не делает сделать - это выбрать ВСЕ номера из базы данных, а затем отфильтруйте их в C#, как это может показаться на первый взгляд.

Питон поддерживает аналогичный синтаксис:

result = [n.Number for n in Numbers if n.Number < 5]

Но это тот самый if предложение здесь выполняет фильтрацию на стороне клиента, а не на стороне сервера, что гораздо менее эффективно.

Есть ли что-то столь же эффективное, как LINQ в Питон?(В настоящее время я оцениваю Питон против. Железный Питон против. Бу, так что ответ, который работает на любом из этих языков, вполне подойдет.)

Это было полезно?

Решение

Я полагаю, что когда IronPython 2.0 будет завершен, у него будет поддержка LINQ (см. этот поток для некоторого примера обсуждения).Прямо сейчас вы должны быть в состоянии написать что-то вроде:

Queryable.Select(Queryable.Where(someInputSequence, somePredicate), someFuncThatReturnsTheSequenceElement) 

Что-то лучшее могло бы попасть в IronPython 2.0 b4 - там много текущее обсуждение о том, как были обработаны конфликты именования.

Другие советы

sqlsoup in sqlalchemy дает вам самое быстрое решение в python, я думаю, если вы хотите четкую (иш) однострочную строку.Посмотрите на страницу, чтобы убедиться в этом.

Это должно быть что-то вроде...

result = [n.Number for n in db.Numbers.filter(db.Numbers.Number < 5).all()]

LINQ - это языковая функция C # и VB.NET.Это особый синтаксис, распознанный компилятором и обработанный особым образом.Это также зависит от другой языковой функции, называемой деревьями выражений.

Деревья выражений - это маленький отличаются тем, что они не являются специальным синтаксисом.Они написаны точно так же, как и любой другой экземпляр класса, но компилятор обрабатывает их специально скрыто, превращая лямбда-выражение в экземпляр во время выполнения абстрактное синтаксическое дерево.Ими можно манипулировать во время выполнения для создания команды на другом языке (т. е.SQL).

Компиляторы C # и VB.NET принимают синтаксис LINQ и преобразуют его в лямбды, затем передают их в экземпляры дерева выражений.Затем существует множество классов фреймворка, которые манипулируют этими деревьями для создания SQL.Вы также можете найти другие библиотеки, как созданные MS, так и сторонние, которые предлагают "LINQ providers", которые в основном подключают другой AST-обработчик для создания чего-либо из LINQ, отличного от SQL.

Таким образом, одним из препятствий для выполнения этих действий на другом языке является вопрос, поддерживают ли они построение / манипулирование AST во время выполнения.Я не знаю, есть ли какие-либо реализации Python или Boo, но я не слышал ни о каких подобных функциях.

Присмотритесь повнимательнее к SQL - алхимия.Вероятно, это может сделать многое из того, что вы хотите.Это дает вам синтаксис Python для простого SQL, который выполняется на сервере.

Ключевым фактором для LINQ является способность компилятора генерировать деревья выражений.Я использую макрос в Nemerle, который преобразует данное выражение Nemerle в объект дерева выражений.Затем я могу передать это методам расширения Where /Select /etc в IQueryables.Это не совсем синтаксис C # и VB, но для меня он достаточно близок.

Я получил макрос Nemerle по ссылке в этом посте:http://groups.google.com/group/nemerle-dev/browse_thread/thread/99b9dcfe204a578e

Должна быть возможность создать аналогичный макрос для Boo.Однако это довольно трудоемкая работа, учитывая большой набор возможных выражений, которые вам необходимо поддерживать.Айенде привел здесь доказательство концепции:http://ayende.com/Blog/archive/2008/08/05/Ugly-Linq.aspx

Boo поддерживает выражения генератора списков, использующие тот же синтаксис, что и python.Для получения дополнительной информации об этом ознакомьтесь с документацией Boo по Выражения генератора и Перечислите основные понятия.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top