2011-11-29 3 views
0

다음 Linq-to-SQL 쿼리가 있습니다. # 5 행에서 내 Where 문에 나열된 조건이 충족되는 Packages 테이블에서 레코드 수를 가져 오려고합니다. 라인 # 5를 제외하고는이 코드에서 모든 것이 정확하다고 생각합니다. 나는 무엇을 잘못 했는가?이 Count 문을 Linq 내에서 Sql 코드로 수정하는 방법은 무엇입니까?

구독 테이블 : :

UserID | Boxes 
001  5 
002  25 
003  5 

var Overage = from s in db.Subscriptions 
    join p in db.Packages on s.UserID equals p.UserID 
    where 
     s.SubscriptionType != "PayAsYouGo" && 
     (s.CancelDate == null || s.CancelDate >= day) && 
     s.StartDate <= day && p.DateReceived <= day && 
     (p.DateShipped == null || p.DateShipped >= day) 
    let AverageBoxSize = (p.Height * p.Length * p.Width)/1728 
    let ActiveBoxCount = p.Count() 
    select new 
    { 
     p, 
     AverageBoxSize, 
     ActiveBoxCount, 
     s.Boxes 
    }; 

오류 메시지가

편집 여기 내 질문을 동반 한 예이다 "알 수없는 방법 카운트() Foo.Data.Package의"입니다

박스는 각 사용자가 자신의 서브 스크립 션하에 허용되는 최대 숫자입니다.

패키지 표

UserID | PackageID | Height | Length | Width 
001  00001  10  10  10 
001  00002  10  10  10 
001  00003  20  10  10 
003  00004  10  20  20 
003  00005  10  10  10 

원하는 쿼리 결과 002이 표시되지 않는

UserID | Boxes | Box Count | Average Box Size 
001  5   3   1,333 
003  5   2   2,500 

사용하기 때문에 절은 사용자

+2

네가 뭘 잘못 했니? 오류가 있습니까? – leppie

+0

무엇이 오류입니까? –

+0

이 산출량은 어떻게됩니까? 0, 1, ... 오류가 발생합니까? – Josh

답변

0

을 ActiveBoxCount = db.Packages.Count을하자,이있을 수 있습니다 당신이 원하는 원하는 :

var Overage = from s in db.Subscriptions 
    join p in db.Packages on s.UserID equals p.UserID 
    where 
     s.SubscriptionType != "PayAsYouGo" && 
     (s.CancelDate == null || s.CancelDate >= day) && 
     s.StartDate <= day && p.DateReceived <= day && 
     (p.DateShipped == null || p.DateShipped >= day) 
    select new 
    { 
     p, 
     AverageBoxSize = (p.Height * p.Length * p.Width)/1728, 
     ActiveBoxCount = db.Packages.Where(x => x.UserID == p.UserID).Count(), 
     s.Boxes 
    } 
+0

다양한 의견을 읽으면서 내 실수는 사용자 ID별로 결과를 그룹화해야한다는 것입니다. ActiveBoxCount 라인이하는 일입니까? 그렇다면 치수의 곱을 합산하기 위해 평균 크기 공식을 수정해야합니다. 그리고 아마도 p의 다른 모든 열을 집계하지 않고 'p'를 선택할 수 없습니다 (더 이상 p가 필요 없기 때문에 괜찮습니다). – hughesdan

+0

당신은 현재's.Boxes' 콜렉션에서 가능하지 않은 경우에 당신이 현재 반환하는 모든 속성을 그룹화해야 할 것입니다 – Magnus

0

P는 수집하지 않습니다 것을 제외 어디에. 읽어야합니다) (라이언의 대답에 귀하의 의견에서

+0

아니면's.Boxes.Count()' – Magnus

+0

@ Ryan입니다. 감사. 실제로 필요한 사용자 수입니다. 하지만 db.Packages.Count()는 모든 사용자에게 총 카운트를 줄 것입니다. 맞습니까? – hughesdan

+0

@ Magnus 좋은 생각이지만 작동하지 않습니다. s.Boxes는 구독 테이블에 따라 사용자가 가질 수있는 최대 상자 수를 알려줍니다. 패키지 테이블에 따라 각 사용자의 수를 실제로 계산하려고합니다. – hughesdan

0

그것은 같은 당신의하자 라인을 대체하는 아마 가장 쉬운 방법 -

Group <columns> By UserId into summary = Group 
Aggregate x in summary Into ActiveBoxCount = x.Count 
관련 문제