2014-09-26 6 views
0

"where"절을 사용할 때 문제가 발생하는 까다로운 linq 쿼리가 있습니다. 서브 쿼리. 다음 linq 쿼리에서 where 절은 "쿼리 본문은 select 절 또는 linq 그룹 절로 끝나야합니다."

내가 함께 일하고 있어요 스키마입니다 :

자동차
이름 - (NVARCHAR)
Garage_Id - (고유 식별자) - FK
아이디 - (고유 식별자) - PK

차고
ID (고유 식별자) - PK
이름 (nvarchar)

,

CarTire 기록 - (날짜) - PK
CarId - (고유 식별자) - PK
TireId - (고유 식별자) - PK

타이어
의 serialNumber - (VARCHAR) 아이디 - (uniqueidentifier) ​​- PK

사이드 웰 영향
기록한 - (날짜) - PK
TireId - (고유 식별자) - PK, FK

TreadImpact
기록 - (날짜) - PK
TireId - (고유 식별자) - PL, FK

CarBodyImpact
기록 - (날짜) - PK
CarId - (고유 식별자) - PK, FK

Name ----------- Id ---------- sidewallimpact -- treadimpact -----carbodyimpact
Red Car --------12334 ------1 ----------------------22--------------------34

가 나는 다음과 같은 SQL 쿼리와 함께 원하는 것을 얻을 수 있습니다 :는 내가 (허접스런 서식을 용서) 내 쿼리를 달성하기 위해 노력하고있어입니다

SELECT TOP(12) cr.NAME, 
      cr.id, 
      t.sidewallimpact, 
      p.treadimpact, 
      s.carbodyimpact, 
      (t.sidewallimpact 
      + p.treadimpact 
      + s.carbodyimpact) Totals 
FROM car cr 
    JOIN (SELECT th.carId, 
       Count(*) sidewallimpact 
     FROM CarTire th 
       JOIN tires ti 
        ON th.tireid = ti.id 
       JOIN sidewallimpact tah 
        ON ti.id = tah.tireid 
     WHERE (tah.recorded >= '01/01/2014' 
        AND tah.recorded <= '09/25/2014') 
     GROUP BY th.carId) t 
    ON cr.id = t.carid 
    JOIN (SELECT th.carid, 
       Count(*) treadimpact 
     FROM CarTire th 
       JOIN tires ti 
        ON th.tireid = ti.id 
       JOIN treadimpact pah 
        ON ti.id = pah.tireid 
     WHERE (pah.recorded >= '01/01/2014' 
        AND pah.recorded <= '09/25/2014') 
     GROUP BY th.carid) p 
    ON cr.id = p.carid 
    JOIN (SELECT cr.id, 
       Count(*) carbodyimpact 
     FROM car cr 
       JOIN carbodyimpact sah 
        ON cr.id = sah.carid 
     WHERE (sah.recorded >= '01/01/2014' 
        AND sah.recorded <= '09/25/2014') 
     GROUP BY tr.id) s 
    ON cr.id = s.id 
WHERE cr.garage_id = 'A6087B27-6E18-4B50-B8A6-7E1F746A312E' 
ORDER BY totals DESC 

하지만하려고 할 때 linqpad를 사용하여 linq로 변환합니다. 문제가 발생합니다. 내가 linqpad이 무엇인지 지금 여기입니다 :

Void Main() 
{ 
var top12 = from tr in Cars 
where tr.Garage_Id == new Guid("A6087B27-6E18-4B50-B8A6-7E1F746A312E") 
    join t in (
     from th in CarTire 
     join ti in Tires 
     on th.TireId equals ti.Id 
     join tah in SideWallImpact      
     on ti.Id equals tah.TireId    
     where (th.Recorded >= new DateTime(2014, 01,01) && th.Recorded <= new DateTime(2014,9,25)) 

     into j1  
     from j2 in j1 
     group j2 by th.CarId into grouped  
     select new { CarId = grouped.Key, Count = grouped.Count(t => t != null)} 
    ) on tr.Id equals t.CarId 
    join p in 
    (
    from th in CarTire 
     join ti in Tires 
     on th.TireId equals ti.Id 
     join pah in TreadImpact      
     on ti.Id equals pah.TireId    
     where (th.Recorded >= new DateTime(2014, 01,01) && th.Recorded <= new DateTime(2014,9,25)) 

     into j1  
     from j2 in j1 
     group j2 by th.CarId into grouped  
     select new { CarId = grouped.Key, Count = grouped.Count(t => t != null)} 
    ) 
    on tr.Id equals p.CarId 
    select new {Name = tr.Name, Id = tr.Id, SidWallCount = t.Count, TreadCount = p.Count }; 

    top12.Dump(); 
} 

의 LINQ 패드는 다음 줄에 질식 :

where (tah.Recorded >= new DateTime(2014, 01,01) && tah.Recorded <= new DateTime(2014,9,25)) 

이 오류 제공 : 곳으로 이동

"A query body must end with a select clause or a group clause linq" 

내가 해봤를 모든 곳에서 동일한 오류가 발생합니다. 어떤 힌트도 크게 감사 할 것입니다. 상대적으로 짧은 것을 유지하기 위해 BodyImpact 테이블에 조인을 포함시키지 않았다는 점에 유의하십시오. 감사!

답변

1

브루노,

난 당신이 필요합니다 생각이

into j1  
from j2 in j1 
where (th.Recorded >= new DateTime(2014, 01,01) && th.Recorded <= new DateTime(2014,9,25)) 
group j2 by th.CarId into grouped 

where (tah.Recorded >= new DateTime(2014, 01,01) && tah.Recorded <= new DateTime(2014,9,25)) 
into j1  
from j2 in j1 
group j2 by th.CarId into grouped 

에서 절

에 의해 절 및 그룹에서 사이 where 절을 이동

tah의 이름을 바꿉니다. 기록되어 있습니다. 기록되어 있습니다.

도움이 되었기를 바랍니다.

+0

이것은 내가 필요한 것입니다. 대단히 감사합니다! – Bruno