Pergunta

Tome este simples C # LINQ consulta, e imaginar que db.Numbers é uma SQL mesa com Number uma coluna:

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

Este será executado de forma muito eficiente em C # , porque gera um SQL consulta algo como

select Number from Numbers where Number < 5 

O que ele não fazer é selecionar todas os números do banco de dados, e depois filtrá-los em C # , como poderia parecer para fazer em primeiro lugar.

Python suporta uma sintaxe semelhante:

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

Mas a cláusula if aqui faz a filtragem no lado do cliente, em vez do lado do servidor, que é muito menos eficiente.

Existe algo tão eficiente como LINQ em Python ? (Atualmente estou avaliando Python vs. IronPython vs. Boo , portanto, uma resposta que funciona em qualquer dessas línguas é bom.)

Foi útil?

Solução

Eu acredito que quando IronPython 2.0 está completo, ele terá suporte LINQ (veja este fio por algum exemplo de discussão). Agora você deve ser capaz de escrever algo como:

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

Algo melhor poderia ter feito isso em IronPython 2.0b4 - há um monte de discussão atual sobre como conflitos de nomes foram manipulados.

Outras dicas

sqlsoup em sqlalchemy dá-lhe a solução mais rápida em python Eu acho que se você quiser uma clara (ish) um forro. Olhada na página para ver.

Deve ser algo como ...

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

LINQ é um recurso de linguagem de C # e VB.NET. É uma sintaxe especial reconhecida pelo compilador e tratados de maneira especial. Ele também é dependente de outro recurso de linguagem chamado de árvores de expressão.

Árvores de expressão são uma pouco diferente, já que eles não são sintaxe especial. Eles são escritos como qualquer outro instanciação de classe, mas o compilador faz tratá-los especialmente sob as cobertas, transformando um lambda em uma instanciação de um tempo de execução árvore de sintaxe abstrata . Estes podem ser manipulados em tempo de execução para produzir um comando em outra língua (ou seja SQL).

A C # e VB.NET compiladores tomar sintaxe LINQ, e transformá-lo em lambdas, em seguida, passar aqueles em instantiations árvore de expressão. Depois, há um monte de classes do framework que manipulam essas árvores para produzir SQL. Você também pode encontrar outras bibliotecas, os dois MS-produziu e terceiros, que oferecem "provedores LINQ", que basicamente pop uma processer AST diferente em produzir algo do LINQ diferente de SQL.

Assim, um obstáculo para fazer essas coisas em outro idioma é a questão de saber se eles oferecem suporte de tempo de execução edifício AST / manipulação. Eu não sei se algum implementações de Python ou Boo fazer, mas eu não ouvi de qualquer um desses recursos.

Olhe atentamente para SQLAlchemy . Isso provavelmente pode fazer muito do que você quer. Dá-lhe a sintaxe Python para SQL simples de idade, que é executado no servidor.

Um fator chave para LINQ é a capacidade do compilador para gerar árvores de expressão. Eu estou usando uma macro no Nemerle que converte uma determinada expressão Nemerle em um objeto árvore de expressão. Posso, então, passar isso para os Onde / Select / etc métodos de extensão no IQueryables. Não é bem a sintaxe do C # e VB, mas é perto o suficiente para mim.

Eu tenho a macro Nemerle através de um link neste post: http://groups.google.com/group/nemerle-dev/ browse_thread / thread / 99b9dcfe204a578e

Deve ser possível criar uma macro semelhante para Boo. É um pouco de trabalho no entanto, dado o grande conjunto de possíveis expressões que você precisa para suportar. Ayende deu uma prova de conceito aqui: http://ayende.com/Blog/archive/2008/ 05/08 / feio-Linq.aspx

Boo suporta expressões gerador de lista usando a mesma sintaxe de python. Para mais informações sobre isso, confira a documentação Boo em Generator expressões e compreensões lista .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top