문제

Entity Framework를 사용할 때 ESQL은 Linq to Entities보다 성능이 더 좋습니까?

나는 주로 강력한 유형 검사 때문에 Linq를 Entities에 사용하는 것을 선호하지만 다른 팀원 중 일부는 ESQL을 사용하는 이유로 성능을 언급하고 있습니다.두 방법 중 하나를 사용할 때의 장단점에 대한 완전한 아이디어를 얻고 싶습니다.

도움이 되었습니까?

해결책

가장 분명한 차이점은 다음과 같습니다.

Linq to Entities는 멋진 쿼리 이해 구문을 포함하여 강력한 형식의 코드입니다."from"이 "select" 앞에 나온다는 사실은 IntelliSense가 도움을 줄 수 있도록 해줍니다.

Entity SQL은 SELECT 문이 FROM 앞에 오는 구문과 같은 보다 친숙한 SQL 기반 쿼리를 사용합니다.eSQL은 문자열 기반이므로 런타임 시 문자열 조작을 사용하는 전통적인 방식으로 동적 쿼리를 구성할 수 있습니다.

덜 분명한 주요 차이점은 다음과 같습니다.

Linq to Entities를 사용하면 "새 선택" 버튼을 사용하여 모양을 변경하거나 쿼리 결과를 필요한 모양으로 "투영"할 수 있습니다.}” 구문.C# 3.0의 새로운 익명 유형에서는 이를 허용했습니다.

항상 ObjectQuery<T>를 반환해야 하므로 Entity SQL을 사용하여 프로젝션을 수행할 수 없습니다.일부 시나리오에서는 ObjectQuery<object>를 사용할 수 있지만 .Select가 항상 ObjectQuery<DbDataRecord>를 반환한다는 사실을 해결해야 합니다.아래 코드를 참조하세요...

ObjectQuery<DbDataRecord> query = DynamicQuery(context,
        "Products",
        "it.ProductName = 'Chai'",
        "it.ProductName, it.QuantityPerUnit");

public static ObjectQuery<DbDataRecord> DynamicQuery(MyContext context, string root, string selection, string projection)
{
    ObjectQuery<object> rootQuery = context.CreateQuery<object>(root);
    ObjectQuery<object> filteredQuery = rootQuery.Where(selection);
    ObjectQuery<DbDataRecord> result = filteredQuery.Select(projection);
    return result;
}

팀원 중 한 명이 자세히 설명하는 더 미묘한 차이점이 있습니다. 여기 그리고 여기.

다른 팁

ESQL은 특히 악의적인 SQL을 생성할 수도 있습니다.나는 상속된 클래스를 사용하는 쿼리에 대한 문제를 추적해야 했고 4줄의 조잡한 ESQL이 100,000자의 괴물 SQL 문으로 번역되었다는 것을 발견했습니다.

Linq에서도 동일한 작업을 수행했으며 컴파일된 코드는 훨씬 더 관리하기 쉬웠습니다. 예를 들어 20줄의 SQL이 있다고 가정해 보겠습니다.

또한 다른 사람들이 언급한 것처럼 Linq는 강력한 유형이지만 편집 및 계속 기능 없이 디버깅하는 것은 매우 짜증나는 일입니다.

기원 후

Entity-SQL(eSQL)을 사용하면 LINQ to Entities보다 동적 쿼리 등의 작업을 더 쉽게 수행할 수 있습니다.그러나 eSQL이 필요한 시나리오가 없다면 유지 관리가 훨씬 더 어렵기 때문에 LINQ에 의존하는 것을 주저할 것입니다(예:더 이상 컴파일 시간 확인 등이 필요하지 않습니다.

저는 LINQ를 사용하면 쿼리를 미리 컴파일할 수 있으므로 더 나은 성능을 얻을 수 있다고 생각합니다.리코 마리아니 LINQ 성능에 대해 블로그에 올렸습니다. 얼마 전에 컴파일된 쿼리에 대해 논의했습니다.

여기에 성능 비교를 보여주는 멋진 그래프가 있습니다. 엔터티 프레임워크 성능 살펴보기ESQL과 엔터티 사이에 차이가 크지 않지만 직접 쿼리를 통해 엔티티를 사용하는 데 중요한 전반적인 차이가 중요합니다.

Entity Framework는 두 계층의 개체 매핑(LINQ to SQL의 단일 계층과 비교)을 사용하며 추가 매핑에는 성능 비용이 발생합니다.적어도 EF 버전 1에서는 애플리케이션 디자이너는 모델링 및 ORM 매핑 기능이 해당 비용을 정당화할 수 있는 경우에만 Entity Framework를 선택해야 합니다.

컴파일 시간 확인을 통해 처리할 수 있는 코드가 많을수록 성능보다 더 높은 프리미엄을 부여할 것입니다.이 단계에서는 아마도 성능 때문만이 아니라 ESQL이 수행할 수 있는 작업이 훨씬 더 유연하기 때문에 ESQL을 선택하게 될 것입니다.실제로 필요한 기능이 없는 기술 스택을 사용하는 것보다 더 나쁜 것은 없습니다.

엔터티 프레임워크는 사용자 지정 속성, 사용자 지정 쿼리(실제로 성능을 조정해야 하는 경우) 등을 지원하지 않으며 linq-to-sql과 동일하게 작동하지 않습니다(예:엔터티 프레임워크에서는 작동하지 않는 기능이 있습니다).

Entity Framework에 대한 개인적 느낌은 많은 잠재력이 있다는 것입니다. 그러나 현재 상태의 프로덕션 환경에서 사용하기에는 구현이 다소 "견고"할 수 있습니다.

직접 쿼리의 경우 엔터티에 대해 linq를 사용하고 동적 쿼리의 경우 ESQL을 사용합니다.아마도 대답은 둘 중 하나가 아니라 그리고/또한일 것입니다.

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