2012-02-13 2 views
3

저는 LINQ와 정말 어려움을 겪고 있습니다. 내 쿼리를 SQL (사실상 피벗)에 작성하고 LINQ에 동일한 문을 작성하려고합니다. 앞으로 어떤 포인터를 많이 주시면 감사하겠습니다. 코드는 아래 참조 :LINQ (GROUP BY 사용)를 사용하여 사례 문 작성

SELECT b.URL, 
SUM(CASE WHEN (a.ExtFlag = 0) THEN 1 ELSE 0 END) AS IntLinks, 
SUM(CASE WHEN (a.ResponseCode >= 400 AND a.ExtFlag = 0) THEN 1 ELSE 0 END) AS IntBroken, 
SUM(CASE WHEN (a.ExtFlag = 1) THEN 1 ELSE 0 END) AS ExtLinks, 
SUM(CASE WHEN (a.ResponseCode >= 400 AND a.ExtFlag = 1) THEN 1 ELSE 0 END) AS ExtBroken 
FROM Link a 
INNER JOIN Host b 
ON a.HostID = b.ID 
GROUP BY b.URL 
ORDER BY b.URL 

많은 감사.

+0

왜 LINQ로 다시 쓰려고합니까? SQL을 직접 사용하고 EF를 통해 실행할 수 있습니다. –

+0

할 수 있습니까? 방법? 내가 처음이다. 닷넷 : ( – stats101

+0

당신의 컨텍스트 클래스에 [ExecuteStoreQuery] (http://msdn.microsoft.com/en-us/library/ee358769.aspx) 메서드가 있습니다. 단지'URL' 클래스를 생성하십시오. ,'IntLinks','IntBroken','ExtLinks','ExtBroken' 속성을 가지고 있습니다. 그리고이 메소드를 사용하여 여러분의 명령으로 채워진 클래스들을 모을 수 있습니다. –

답변

9

나는 이것이 당신이 원하는 일을해야한다고 생각 - 그건 적어도 해볼만 한 가치 :

var query = from link in db.Links 
      join host in db.Hosts on link.HostID equals host.ID 
      group link by host.Url into links 
      select new 
      { 
       Url = links.Url, 
       IntLinks = links.Count(link => link.ExtFlag == 0), 
       IntBroken = links.Count(link => link.ExtFlag == 0 && 
               link.ResponseCode >= 400), 
       ExtLinks = links.Count(link => link.ExtFlag == 1), 
       ExtBroken = links.Count(link => link.ExtFlag == 1 && 
               link.ResponseCode >= 400), 
      }; 
2

입니다 그것을 수행하는 방법 : 당신은 당신의 CASE?: 연산자를 사용할 수 있습니다

from a in db.Links 
group a by a.Host.Url into g 
select new 
{ 
    Url = g.Key, 
    IntLinks = (
     from x in g 
     select x.ExtFlag == 0 ? 1 : 0) 
     .Sum() 
}; 

.