2010-01-19 5 views
2

올바른 데이터를 반환하는 일부 linq 있습니다.linq sql - 집계 계산

var numEmails = (from row in EmailBatchProposal 
where row.EmailBatchId == emailBatchId 
select row.EmailBatchProposalId).Count(); 

그러나 linq을 올바르게 이해하면 최적으로 수행되지 않습니다. 모든 데이터를 가져온 다음 목록을 살펴보고 행을 계산합니다. 나는 성능 이유는 명백하다 신뢰

Select count(*) from ... 

: 내가 좋아하는 정말 줄은 같이 사용 (배경)에 LINQ를위한 것입니다.

누구든지 적절한 방법을 알고 있습니까?

답변

1

사실, linq 쿼리가 IQueryable을 구현하고 기본 SQL 변형으로의 변환을 지원하는 컬렉션과 함께 사용되는 경우 Count 함수를 예제에서 올바르게 변환하는 것은 매우 기본적인 기능입니다.

1

사람들은 일반적으로 연습함으로써 가장 잘 배웁니다. LinqPad (무료) 사본을 가져와 Linq 쿼리에 입력하고 생성 한 SQL을 확인하는 것이 좋습니다. 그런 다음 원하는 결과를 얻을 때까지 Linq 쿼리를 수정할 수 있습니다.

+0

좋은 생각, 감사 :

 using (var dbc = new siteDataContext()) { dbc.Log = Console.Out; var bd = (from b in dbc.birthdays select b).Count(); Console.WriteLine("{0}", bd); } 

쿼리를 제공합니다. – Daniel

1

그냥 .Count()의 인수를 사용할 수 있습니다.

int numEmails = EmailBatchProposal.Count(x => x.EmailBatchId == emailBatchId) 

아래에 언급했듯이이 방법은 실제로 다른 SQL로는 해결되지 않지만 최소한 더 깨끗한 대안이라고 생각합니다. 사실

+2

그것은 다르지 않습니다 ... 그것은 동일한 쿼리를 작성하는 다른 방법 일뿐입니다. 실제로 후드에서 실행되는 SQL은 완전히 동일합니다. –

+0

두 버전의 차이점은 무엇입니까? ToArray() 같은 쿼리 실행을 강요하지 않는 한, Count를 람다 또는 Count로 끝내면 상관 없습니다. –

+0

이것을 지적 해 주신 Michael과 Thomas에게 감사드립니다. 나는 당신의 의견을 반영하기 위해 나의 대답을 편집했다. – recursive

1

는 LINQ - 투 - SQL은, 예를 들어 ... 카운트를해야한다고 알고 똑똑 나는 다음과 같은 쿼리가있는 경우 :

var v = (from u in TblUsers 
     select u).Count(); 

는 SQL 실제로 I 때 실행 실행 :

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

놀라운가요? 또 다른 포스터가 LinqPad을 얻는 좋은 제안이었습니다.이 도구는 훌륭한 도구입니다. 그것은 실행될 정확한 SQL을 보여줍니다. SQL 프로파일 러를 사용하여 언제든지 확인할 수 있습니다.

+0

아, 너무 느 렸어. :) 투표! – mark123

1

쿼리에 사용 된 SQL 로그를 확인하십시오.

SELECT COUNT(*) AS [value] 
FROM [dbo].[birthdays] AS [t0] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1