2011-09-17 3 views
2

나는이 일의 바보 습관을받은했습니다Linq가 무엇을 선택할지 계산할 때?

return 
    (from c in db.tblUserAlerts 
    where c.userID == UserID && !c.hasRead 
    select new { c.ID }).Count(); 

인가 더 잘 (저장 메모리) 전체 c 기록에 가정으로 c.ID을 반환? 예 :

return 
    (from c in db.tblUserAlerts 
    where c.userID == UserID && !c.hasRead 
    select c).Count(); 
+2

'return db.tblUserAlerts.Count (c => c.userID == UserID &&! c.hasRead)'대신 Linq가 정보에 입각 한 선택을 할 수 있습니다.:) – bzlm

+0

@Bzlm 좋은 생각인데 위와 같이 쓰는 것을 선호합니다 –

+1

환경 설정이 여러분을 되찾고 있습니다. 그들을 놓아 줘. – bzlm

답변

5

나는 데이터가 얼마나 많은 변화를 겪어야하는지가 문제라고 생각한다. 당신이 뭘 하려는지, 나는 가장 효율적이 될 것이라고 생각 :

return db.tblUserAlerts.Count(c=>c.userID == UserID && !c.hasRead); 

단지 물건을 계산, 당신이 정말로 단 한 방법으로 데이터를 실행하고 복사되지 않았거나 데이터를 변환하기 때문에 그 술어와 일치합니다.

EDIT : 내가 태그를 다시보고 linq-to-sql이 있는지 확인하십시오. LINQ to SQL과 같은 쿼리 공급자를 사용하는 경우 쿼리가 변환됩니다. LINQ - 투 - SQL은 더 많은 일을해야 할 수도 있습니다 것을 제외하고, 어떠한 속도 차이가 안이 경우

SELECT count(c.ID) FROM tblUserAlerts WHERE c.userID == 'UserID' AND NOT c.hasRead 

: 나는 LINQ - 투 - SQL 쿼리 번역기가 같은 것으로 해석 할 거라 생각 표현식 트리에 더 많은 것이 있기 때문에 쿼리를 번역 할 때. 그 속도 차이는 거의 무시할 수있을 것입니다. 위의 원래 대답은 LINQ-to-Objects에 더 적용 가능합니다. LINQ-to-SQL을 사용하는 경우 속도 저하에 민감하지 않으면 (즉, 긴밀한 루프에서 수천 번 실행하는 경우) 대략적으로 동일해야합니다.

+0

많은 것들이 *있을 것입니다. 그럴 수는 없습니다. * 그리고 *해야 할 수도 있습니다. :) 그 이외에, 나는 동의한다. – bzlm

+0

나는 그런 식으로 표현한다. 왜냐하면 내가 분명히하려고 노력하기 때문에 나는 어떤 부분에서 약간 벗어날 수 있지만, 원칙적으로 내가 말하는 것은 사실이다. 예를 들어, LINQ-to-SQL에 의해 생성 된 실제 SQL을 게시 할 수 있도록 전체 모의 프로젝트를 만들 수 있었지만 교양있는 추측을하기에 충분할 것이라고 생각했습니다. 나는 당신이 의미하는 것을 본다 :) –

1

이 쿼리를 작성하는 가장 확실한 방법은 제안 된 것입니다. 이 SQL로 번역, 그리고 COUNT(*)의 실행 차이 COUNT(id)에가는 - SQL은 COUNT (1) WHERE...

그것은 당신의 선택은 비용 또는 아무것도 얻을 것입니다 매우 확률이 낮다는 실행할 수 있습니다이 경우

return db.tblUserAlerts.Count(c=>c.userID == UserID && !c.hasRead); 

실행 차이가 COUNT(id)COUNT(1) 인 것처럼 작습니다 (전혀 존재하지 않는 경우). 하지만 아무 것도하지 않는 코드를 작성하는 이유는 무엇입니까? 을 선택하지 않아도됩니다..

당신이

인가 물어 이상한 것 더 잘 전체 C 레코드에 가정으로 (메모리 저장합니다) c.ID를 돌아갑니다?

하지만 의견을

좋은 생각하지만 난

당신이 '메모리 저장'하는 것이 효율적이고 깨끗한 코드를 작성 하시겠습니까 위처럼을 작성하거나 할 선호

명백한 이유가 없으므로 선호도에 따라 글을 쓰고 싶습니까? 더 적은 코드는 더 깨끗한 코드입니다. 마치 .Count(Exp<>)이 모호한, 거의 사용되지 않는 오버로드 인 것처럼 아닙니다.

관련 문제