2010-06-30 3 views
2

우리 회사는 LINQ를 사용하기 시작했고 LINQ 명령과 SQL의 (그게 단어가있는 경우), 내 질문에LINQ 카운트 .. 가장 좋은 방법

Dim query = (From o In data.Addresses _ 
        Select o.Name).Count 
입니다 난 여전히 추상성에 약간의 문제가 있어요 내 마음의 위의에

는 SQL은 모든 행을 반환하고이 된 IQueryable 결과에서 수 행의 수를 않습니다, 그래서 나는

Dim lstring = Aggregate o In data.Addresses _ 
    Into Count() 

더 잘 될 것 아니면이 방법 LINQ의 작동 생각 이상입니다 ? 집에서 VB Express를 사용하므로 SQL 프로파일 러에 액세스 할 수 없으므로 데이터베이스에 전송되는 실제 SQL을 볼 수 없습니다.

+5

전혀없는 (제로 제휴), 나는 LINQPad (http://www.linqpad.net/)에서 LINQ에서 SQL 표현식으로 생성 된 SQL을 볼 수 있도록 해준다. VB 및 C#을 사용하여 재 작성/재실행없이 쿼리 스 니펫에서 작업하는 것이 다소 쉽습니다. –

+0

@Marc 고맙습니다. 저 자신이 질문에 대답 할 수있게 해주었습니다 .... 좋은 도구 .... ps, 대답 해주세요. 제발 틱 할 수 있습니다 .-) – spacemonkeys

답변

4

언급 한 바와 같이, 이들은 기능적으로 동일하며, 단지 쿼리 구문을 사용합니다. 당신이 LINQPad에 VB 문 (들)로 다음과 같은 평가되는 경우, 내 댓글에서 언급 한 바와 같이

:

Dim lstring = Aggregate o In Test _ 
    Into Count() 

당신은 생성 된 SQL 출력 창에서이 얻을 :

SELECT COUNT(*) AS [value] 
FROM [Test] AS [t0] 

어떤 평가 된 다음 VB LINQ 표현식과 같습니다.

(From o In Test_ 
    Select o.Symbol).Count 

그는 똑같은 결과를 냈다.

2

Visual Basic에 익숙하지 않지만

http://msdn.microsoft.com/en-us/library/bb546138.aspx

를 기반으로하는 두 가지 방법은 동일합니다. 하나는 메서드 구문을 사용하고 다른 하나는 쿼리 구문을 사용합니다.

쿼리가 실행될 때 SQL 프로필러를 사용하여 확실히 확인할 수 있습니다.

PS - LINQ의 "요점"은 코드/VB- 랜드를 남기지 않고도 쿼리 작업을 쉽게 할 수 있다는 것입니다.

+0

건배하지만 그걸 볼 수는 없습니다. .Count, 순간에 익스프레스를 사용하므로 프로파일 러에 액세스 할 필요가 없습니다. (돈을 사용해야합니다.) PS 추신 : PS를 얻었습니다. "LINQ 작동 방식을 이해하지 못했습니다" – spacemonkeys

0

나는 Linq가 SQL과 관련하여 요점을 놓치고 있다고 생각한다. 필요하면 바인딩이 늦게 바인딩되어 있으므로 카운트 번호가 필요할 때 쿼리가 생성된다. SQL에 대한 그 Linq를하기 전에

은 당신이 그것을 필요로 SQL에 "번역"합니다 표현 나무 .... http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx alt text http://www.scottgu.com/blogposts/linqtosql3/step5.jpg

스콧 참조 디버깅하는 방법 http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx를 생성

+0

대답합니까 위의 질문? – spacemonkeys

+0

죄송합니다, 내가 질문을하는 이유는 내가 dubugger 또는 .string을 넣을 때 "Dim query = (from o In data.Addresses o.Name을 선택하십시오.)"결과가 2 일 때 결과가 나옵니다. 다른 쿼리에 대해 동일한 작업을 수행합니다. 예상되는 "select count (*)"SQL을 사용하므로 후자가 더 좋을 것입니다. 그러나 프로파일 러에 액세스 할 수 없으므로 확인할 수 없습니다. – spacemonkeys

+0

시도해보십시오 가 배울 수있는 가장 좋은 도구는 http://www.linqpad.net/ LinqPad http://www.codeproject.com/KB/linq/LINQ2Log4Net.aspx – salgo60

1

여기서 중요한 것은 코드가 다양한 데이터 소스에서 작동한다는 것입니다. 매우 효율적인 방법으로 그렇게 할 수는 있지만 보장 할 수는 없습니다. 그것은 확실하게 SQL 소스 (효율적으로 SELECT COUNT(*) SQL 쿼리로 변환되고있다. 그것은 소스가 메모리 내 컬렉션 (Count 속성을 호출로 변환되면) 효율적으로 완료됩니다. 그것은 ' 소스가 컬렉션이 아닌 열거 형 일 경우 매우 효율적으로 수행됩니다 (이 경우에는 모든 것을 읽고 카운트합니다). 그러나이 경우 실제로는 더 효율적인 방법이 없습니다.

세부적인 사항에 대해 걱정할 필요없이 각각의 경우에 가능한 가장 효율적인 방식으로 동일한 개념 작업을 수행했습니다. 집계와 관련해서는 큰 문제가 아니지만보다 복잡한 경우에는 더 큰 문제입니다.

"내 마음 속에 SQL이 모든 행을 반환하고 숫자 행을 계산합니다"라고 말할 때 어느 정도까지는 맞습니다. 개념적으로 해당 쿼리에서 어떤 일이 일어나는지는이지만 구현이 다를 수 있습니다. SQL의 실제 쿼리가 SQL 명령의 리터럴 해석과 어떻게 일치하지 않을 지와 비교하여 가장 효율적인 방법을 선택합니다.

+0

감사합니다. Jon, 제 생각에 그 한 가지 지난 달에 LinQ를 사용하여 배웠던 것은 SQL을 생성하는 것이 무엇인지를 추정하는 것이 아니라 가능한 한 오랫동안 iQueryable 객체 유형을 멀리 유지하는 것입니다. – spacemonkeys

+0

예. 사실, 때로는 내가 만든 SQL을보고 약간 이상하게 보일 때 다음 수준으로 내려 가서 쿼리 계획을 보면 사실 LINQ로 SQL을 작성한 것이 더 분명한 방법보다 낫습니다. 생성 된 SQL을 살펴볼 가치가 있습니다. 적절한 색인 작성 및 통계를 통해 도움을 줄 수 있으므로 더 복잡하거나 자주 조회되는 검색어를 찾으십시오. –