2011-05-06 4 views
1

Linq2NHibernate를 사용하여 여러 쿼리에서 테이블의 데이터 묶음을 가져옵니다. 테이블에 열이 10 개 포함되어 있지만 중 3 개만 내 쿼리에이고 다른 속성은 필요하지 않습니다. 그럼에도 불구하고 생성 된 SQL은 (예상대로) 각 쿼리에 대해의 모든 속성 을로드합니다.Linq2NHibernate를 최적화 할 때 권장되는 방법

쿼리를 최적화하는 가장 좋은 방법은 무엇입니까?

최적화 된 쿼리에 좀 더 간단한 엔티티 변형을 사용하는 것이 합리적입니까? 나는. 2 개의 프로퍼티만을 포함하는 엔티티를 생성하고 그것을 동일한 테이블에 매핑하려면? 실제 엔티티가 가벼운 엔티티로부터 상속받은 경우 너무 복잡하지 않아야하며 NHibernate는 더 작은 데이터 서브셋 만 가져옵니다.

일반적인 방법입니까, 아니면 더 나은 방법으로 쿼리를 최적화 할 수 있습니까? LINQ는 지금 당장이 프로젝트에서 사용되기 때문에 LINQ를 고수하고 싶습니다.

[편집]

마이크 아래 대답으로,이 솔루션은 매우 분명하다 : 실제 예상 DTO들 인출하는 데 필요한 속성을 지시합니다. 이것 만 투영 된 속성을 가져 오는 쿼리를 생성하는 동안

/* fetch actual entities */ 
var results = session 
    .Query<Food>() 
    .Where(p => p.Proteins < 100 && p.Fats < 50); 

/* ... results in: */ 
SELECT Id, Proteins, Fats, Carbs, Name, Whatever 
FROM [Food] WHERE Proteins < 100 AND Fats < 50 

:

,이 쿼리는 모든 속성을로드 : 그래서 예를 제공 할 것입니다, 그냥 명확하게하는

/* fetch light DTOs */ 
var results = session 
    .Query<Food>() 
    .Where(p => p.Proteins < 100 && p.Fats < 50) 
    .Select(p => new 
    { 
     Proteins = p.Proteins, 
     Fats = p.Fats   
    }); 

/* generated sql: */ 
SELECT Proteins, Fats 
FROM [Food] WHERE Proteins < 100 AND Fats < 50 
+1

QueryOver로 전환하는 것을 고려 했습니까? NH2Linq는 최신 NH 릴리스에서는 권장되지 않습니다. –

+0

@ Matías : IMHO SQL이 생성되는 방식이 바뀌지 않을 것이라고 생각합니다. 엔티티를 가져 오기 위해 모든 속성을 가져와야합니다. 하지만 지금은 많은 코드를 변경하는 데 시간을 낭비하고 싶지 않습니다. LINQ는 지금까지 잘 작동했습니다 (위에서 언급 한 성능 문제 제외). – Groo

+0

하지만 문제는 NHtoLinq가 더 이상 지원되지 않는다는 것입니다. 그냥 제안입니다 :) –

답변

1

실제 질문을 게시하지 않았으므로 문제가 무엇인지 알기가 어렵습니다. 일반적으로 필요한 필드만으로 데이터 전송 개체 (DTO)를 채 웁니다. 그러면 한 가지 문제가 해결됩니다. 도메인 엔터티의 모든 필드를 포함하는 LINQ 쿼리의 경우 예상을 사용해야합니다. 프로젝션은 NHibernate에게 당신의 도메인의 나머지를 제외한 것들만 가져올 것이라고 말할 것이다. NHibernate에 LINQ를 쿼리하지는 않지만 개념은 같습니다.

나는 새로운 QueryOver API 사용을 고려해야한다는 Matías Fidemraizer에 동의합니다.

+0

고마워, 내 게시물을 마친 직후. 실제로 눈이 아파요. :) QueryOver에 관해서는, 지금 스위치를 "권장"했기 때문에 지금 내 전체 응용 프로그램을 리팩토링 할 때 요점을 보지 못했습니다. LINQ는 적어도 지금 당장은 안정되어 있습니다. 코드는 잘 리팩토링되었고, 느슨하게 결합되었으며, NHibernate에서 필요한 모든 ORM 이점을 얻습니다. 그리고 나는 발생한 모든 SQL을 검사하여 계속 진행되는 것을 지켜 보았습니다. – Groo

관련 문제