2014-09-03 4 views
0

나는 다음과 같은 쿼리가 :OrderBy는 어떻게 적용됩니까?

var vendors = (from pp in this.ProductPricings 
       join pic in this.ProductItemCompanies 
       on pp.CompanyId equals pic.CompanyId into left 
       from pic in left.DefaultIfEmpty() 
       orderby pp.EffectiveDate descending 
       group pp by new { pp.Company, SortOrder = (pic != null) ? pic.SortOrder : short.MinValue } into v 
       select v).OrderBy(z => z.Key.SortOrder); 

사람이 마지막 OrderBy()이 적용되는 방법을 알고 있나요을? 그것들은 SQL 질의의 일부가 되었습니까, 아니면 모든 결과가 메모리에로드 된 다음 OrderBy()으로 전달 되었습니까?

두 번째 경우 모두 하나의 쿼리로 만들 수있는 방법이 있습니까? 첫 번째 항목 만 있으면되며 모든 결과를 반환하는 것은 매우 비효율적입니다. 당신은 여전히 ​​IQueryable을 사용하고 있기 때문에

+1

EFProfiler와 같은 도구를 보면 생성 된 쿼리의 모양을 알 수 있습니다. 당신은 열거하지 않기 때문에, 내 이해는 순서에 의해 생성 된 SQL 문의 일부가 될 것입니다. – Hammerstein

+0

생성 된 SQL이 무슨 일이 일어나는지 알려줄 것입니다. http://stackoverflow.com/questions/1412863/how-do-i-view-the-sql-generated-by-theent-framework – mxmissile

+0

DBMS는 당신이 피하려고하는 것을 잘 할 수 있습니다. 즉, 모든 결과를 반환하십시오. 그들을 주문하십시오. 쿼리가 충분히 복잡하면 SQL Server는 쿼리를 다중 스레드하고 [이 기사] (http://blogs.msdn.com/b/conor_cunningham_msft/)에 따라 반환하기 전에 전체 결과 집합을 다시 정렬해야합니다. archive/2008/08/27/no-seatbelt-order-by-order-by-order-by.aspx) – barrick

답변

1

음이 원래 쿼리에 OrderBy을 적용하려고합니다 - 그것은 ToList 또는 동등한를 사용하여 콜렉션에 IEnumerable로 변환 또는 수화되지 않은 것을 의미한다.

여부 이 될 수 있는지 여부는 결과 쿼리의 복잡도에 따라 다릅니다. 당신은 그것을 알아 내기 위해 노력해야 할 것입니다. 내 생각 엔 메인 쿼리를 하위 쿼리 및 레이어 "SELECT * FROM (...) ORDER BY SortOrder" 외부 쿼리로 바뀝니다.

1

구체적인 예를 들어 보면이 상황에서의 순서는 대부분 표현식 트리가 빌드 될 때 appliead가 될 것이며, LINQ 쿼리에 의해 생성 된 SQL에 적용될 것입니다. 다른 답변에서 언급 한 ToList와 같은 Enumarable은 Enumerable의 확장으로 적용됩니다.

0

당신이 쓰는대로 이해할 수 없기 때문에 읽을 수있는 코드를 사용할 수도 있습니다. 나중에 linq 문을 사용하여 문제가 발생합니다. 문제는 문이 값을 반환하지 않는 경우 값이 null이되고 예외가 발생할 때마다 발생한다는 것입니다.

주의해야합니다. 코드 친구를 이해하기 위해 모든 것을 개별적으로 수행하는 것이 좋습니다.

+0

나는 틀렸다고 생각합니다. null 예외가 발생할 수있는 곳이 여기에 없습니다. 너? 그리고 나는 또한 당신이 읽는 것을 찾을 수없는 것을 알지 못합니다. 귀하의 코드는 마치 내 것과 같습니다. 그것을 쓸 수있는 더 나은 방법이 있었습니까? –

+0

나는 나의 experence에 대해 이야기한다. Linq를 SQL에 사용했는데 이것이 내 문제였습니다. 그리고 redeable 코드는 쉽게 이해할 수 있습니다. 이 말은 대답 친구가 있다고 말하고 싶지 않습니다. – icalderond

+0

글쎄, 고마워. 하지만 당신은 두 가지 질문에 대답하지 않았습니다. 나는 당신의 의견에서 유용한 정보가 없습니다. 널 예외에 대해서 당신이 틀렸다고 생각해. 그러나 내가 틀렸다는 것을 보여주는 당신에게 열려있을 것입니다. –

관련 문제