Pregunta

Toma esto simple C#LINQ consulta, e imagina que db.Numbers es un SQL tabla con una columna Number:

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

Esto se ejecutará de manera muy eficiente en C#, porque genera una SQL consultar algo como

select Number from Numbers where Number < 5 

que es no hacer es seleccionar todo los números de la base de datos y luego filtrarlos en C#, como podría parecer en un principio.

Pitón admite una sintaxis similar:

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

Pero es el if La cláusula aquí realiza el filtrado en el lado del cliente, en lugar del lado del servidor, que es mucho menos eficiente.

¿Existe algo tan eficiente como LINQ en Pitón?(Actualmente estoy evaluando Pitón vs. HierroPython vs. Abucheo, por lo que una respuesta que funcione en cualquiera de esos idiomas está bien).

¿Fue útil?

Solución

Creo que cuando IronPython 2.0 esté completo, tendrá soporte LINQ (ver este hilo para ver algún ejemplo de discusión).Ahora deberías poder escribir algo como:

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

Algo mejor podría haber llegado a IronPython 2.0b4: hay muchas discusión actual sobre cómo se manejaron los conflictos de nombres.

Otros consejos

sopa sql en sqlalchemy te ofrece la solución más rápida en Python, creo que si quieres una línea clara (más o menos).Mira la página para ver.

Debería ser algo como...

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

LINQ es una característica del lenguaje de C# y VB.NET.Es una sintaxis especial reconocida por el compilador y tratada de manera especial.También depende de otra característica del lenguaje llamada árboles de expresión.

Los árboles de expresión son una pequeño se diferencian en que no tienen una sintaxis especial.Están escritos como cualquier otra instanciación de clase, pero el compilador los trata especialmente en secreto al convertir una lambda en una instanciación de un tiempo de ejecución. árbol de sintaxis abstracta.Estos pueden manipularse en tiempo de ejecución para producir un comando en otro idioma (es decir,SQL).

Los compiladores de C# y VB.NET toman la sintaxis de LINQ, la convierten en lambdas y luego las pasan a instancias de árboles de expresión.Luego hay un montón de clases marco que manipulan estos árboles para producir SQL.También puede encontrar otras bibliotecas, tanto producidas por MS como de terceros, que ofrecen "proveedores LINQ", que básicamente introducen un procesador AST diferente para producir algo a partir de LINQ que no sea SQL.

Entonces, un obstáculo para hacer estas cosas en otro idioma es la cuestión de si admiten la construcción/manipulación de AST en tiempo de ejecución.No sé si alguna implementación de Python o Boo lo hace, pero no he oído hablar de ninguna de esas características.

Mira de cerca SQLAlquimia.Probablemente esto pueda hacer gran parte de lo que desea.Le brinda la sintaxis de Python para SQL antiguo que se ejecuta en el servidor.

Un factor clave para LINQ es la capacidad del compilador para generar árboles de expresión.Estoy usando una macro en Nemerle que convierte una expresión de Nemerle determinada en un objeto de árbol de expresión.Luego puedo pasar esto a los métodos de extensión Where/Select/etc en IQueryables.No es exactamente la sintaxis de C# y VB, pero para mí es lo suficientemente parecida.

Obtuve la macro Nemerle a través de un enlace en esta publicación:http://groups.google.com/group/nemerle-dev/browse_thread/thread/99b9dcfe204a578e

Debería ser posible crear una macro similar para Boo.Sin embargo, es bastante trabajo, dado el gran conjunto de expresiones posibles que necesita admitir.Ayende ha dado una prueba de concepto aquí:http://ayende.com/Blog/archive/2008/08/05/Ugly-Linq.aspx

Boo admite expresiones del generador de listas que utilizan la misma sintaxis que Python.Para obtener más información al respecto, consulte la documentación de Boo en Expresiones generadoras y Lista por comprensión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top