문제

이것을 간단하게 가져 가라. C#LINQ 질문하고 상상해 보세요 db.Numbers 이다 SQL 열이 하나인 테이블 Number:

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

이는 매우 효율적으로 실행됩니다. 씨#, 을 생성하기 때문입니다. SQL 다음과 같은 것을 쿼리

select Number from Numbers where Number < 5 

그게 뭐야? 그렇지 않다 할 일은 선택이다 모두 데이터베이스에서 숫자를 가져온 다음 필터링합니다. 씨#, 처음에는 그렇게 보일 수도 있습니다.

파이썬 유사한 구문을 지원합니다.

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

하지만 그것은 if 여기서 절은 서버 측이 아닌 클라이언트 측에서 필터링을 수행하므로 훨씬 덜 효율적입니다.

이것만큼 효율적인게 있을까 링크 ~에 파이썬?(현재 평가 중입니다. 파이썬IronPython우우, 따라서 해당 언어 중 어느 언어로든 작동하는 답변은 괜찮습니다.)

도움이 되었습니까?

해결책

나는 IronPython 2.0이 완성되면 LINQ를 지원하게 될 것이라고 믿습니다. 이 스레드 몇 가지 예시 토론을 위해).지금은 다음과 같이 작성할 수 있습니다.

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

더 나은 것이 IronPython 2.0b4에 포함되었을 수도 있습니다. 현재 토론 이름 충돌을 처리하는 방법에 대해 설명합니다.

다른 팁

sqlsoup sqlalchemy에서는 Python에서 가장 빠른 솔루션을 제공합니다. 명확한(ish) 하나의 라이너를 원한다면 생각합니다.보려면 페이지를 보세요.

그것은 다음과 같아야합니다 ...

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

LINQ는 C# 및 VB.NET의 언어 기능입니다.컴파일러가 인식하고 특별하게 처리하는 특수 구문입니다.또한 표현식 트리라는 다른 언어 기능에도 의존합니다.

표현식 트리는 작은 특별한 구문이 아니라는 점에서 다릅니다.다른 클래스 인스턴스화와 마찬가지로 작성되지만 컴파일러는 람다를 런타임 인스턴스화로 전환하여 내부적으로 특별히 처리합니다. 추상 구문 트리.이는 런타임에 조작되어 다른 언어로 명령을 생성할 수 있습니다(예:SQL).

C# 및 VB.NET 컴파일러는 LINQ 구문을 가져와 이를 람다로 변환한 다음 이를 식 트리 인스턴스화에 전달합니다.그런 다음 이러한 트리를 조작하여 SQL을 생성하는 여러 프레임워크 클래스가 있습니다.또한 기본적으로 다른 AST 프로세서를 사용하여 SQL 이외의 LINQ에서 무언가를 생성하는 "LINQ 공급자"를 제공하는 MS 제작 및 타사 라이브러리를 찾을 수도 있습니다.

따라서 다른 언어로 이러한 작업을 수행하는 데 장애물 중 하나는 런타임 AST 구축/조작을 지원하는지 여부에 대한 질문입니다.Python이나 Boo의 구현이 지원되는지는 모르겠지만 그러한 기능에 대해서는 들어본 적이 없습니다.

자세히 살펴보세요 SQLAlchemy.이것은 아마도 당신이 원하는 많은 일을 할 수 있습니다.서버에서 실행되는 일반 SQL에 대한 Python 구문을 제공합니다.

LINQ의 핵심 요소는 컴파일러가 식 트리를 생성하는 기능입니다.나는 주어진 Nemerle 표현식을 표현식 트리 객체로 변환하는 Nemerle의 매크로를 사용하고 있습니다.그런 다음 이를 IQueryables의 Where/Select/etc 확장 메서드에 전달할 수 있습니다.C#과 VB의 구문은 아니지만 제게는 충분히 가깝습니다.

이 게시물의 링크를 통해 Nemerle 매크로를 얻었습니다.http://groups.google.com/group/nemerle-dev/browse_thread/thread/99b9dcfe204a578e

Boo에 대해서도 유사한 매크로를 생성하는 것이 가능해야 합니다.그러나 지원해야 하는 가능한 표현식의 수가 많다는 점을 고려하면 꽤 많은 작업이 필요합니다.Ayende는 여기에 개념 증명을 제공했습니다.http://ayende.com/Blog/archive/2008/08/05/Ugly-Linq.aspx

Boo는 Python과 동일한 구문을 사용하여 목록 생성기 표현식을 지원합니다.이에 대한 자세한 내용은 Boo 문서를 확인하세요. 생성기 표현식 그리고 목록 이해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top