2016-11-18 1 views
1

나는 투영과 그룹화에 관해서는 여전히 꽤 녹색이다. linq을 사용하여 다음 SQL 쿼리의 결과를 얻으려면 어떻게해야합니까? 아니면 linq 게다가이 쿼리를 검색하는 더 나은 접근법은 무엇입니까? 엔티티 프레임 워크를 사용하고 있고 난 그냥 SQL 하드 코드 할 수 있지만 더 나은 방법이 있으면 그렇게하지 않는 것이 좋습니다. 투영 된 linq 쿼리의 하위 테이블에서 열을 어떻게 합계합니까?

SELECT j.JobId, j.Name, j.OrderId, j.ShipDate, 
    st.ShipTypeId, sum(p.DeliveryCnt * p.Quantity) AS 'DeliveryCnt' 
FROM Jobs j 
JOIN ShipTo st ON j.JobId = st.JobId 
JOIN DesignSets ds ON j.JobId = ds.JobId 
JOIN DesignSetAreas dsa ON ds.DesignSetId = dsa.DesignSetId 
JOIN Products p ON dsa.DesignSetAreaId = p.DesignSetAreaId 
WHERE j.ShipDate >= '11/13/2016' AND j.ShipDate <= '11/26/2016' 
GROUP BY j.JobId, j.Name, j.OrderId, j.ShipDate, st.ShipTypeId 

아래 코드

내가 지금까지 가지고있는,하지만 난 곳 또는 내가 그룹을 얼마나 확실하지 않다, 또는이도 가능합니다.

var shipList = from j in db.Jobs 
        join st in db.ShipTo on j.JobId equals st.JobId 
        join ds in db.DesignSets on j.JobId equals ds.JobId 
        join p in db.Products on ds.DesignSetId equals p.DesignSetId 
        where j.ShipDate >= startDate && j.ShipDate <= endDate 
        select new ShipScheduleViewModel 
        { 
         JobId = j.JobId, 
         Name = j.OrderId + " " + j.Name, 
         ShipDay = ((DateTime)j.ShipDate).Day, 
         ShipVia = st.ShipTypeId, 
         Count = p.DeliveryCnt * p.Quantity 
        }; 
+0

먼저 나는 https://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/을 조인을 통해 당신은 당신이 탐색에 대한 맞아 – juharr

+0

탐색 속성의 사용을 포용하는 것이 좋습니다 속성. 코드를 작성하는 데 훨씬 깨끗한 방법입니다. 더 좋은 방법이 있다는 것을 상기시키는 링크에 감사드립니다. – Kyle

답변

1

기본적으로 group by 구문은 (이 경우에 의해 그룹과 값이 원하는합니다 (pProducts 당신이 select에서 집계하는 무엇,이 경우)이 그룹에서 원하는 무슨 말을 할 필요 jJobst.ShipTypeId) 마지막으로 그룹화를 select에서 사용할 수있는 변수에 할당합니다.

var shipList = from j in db.Jobs 
       join st in db.ShipTo on j.JobId equals st.JobId 
       join ds in db.DesignSets on j.JobId equals ds.JobId 
       join p in db.Products on ds.DesignSetId equals p.DesignSetId 
       where j.ShipDate >= startDate && j.ShipDate <= endDate 
       group p by new { j, st.ShipTypeId } into grp 
       select new ShipScheduleViewModel 
       { 
        JobId = grp.Key.j.JobId, 
        Name = grp.Key.j.OrderId + " " + grp.Key.j.Name, 
        ShipDay = ((DateTime)grp.Key.j.ShipDate).Day, 
        ShipVia = grp.Key.ShipTypeId, 
        Count = grp.Sum(p => p.DeliveryCnt * p.Quantity) 
       }; 
+0

감사합니다. 매우 빠른 응답이었습니다. 그것은 내가 필요한 것입니다. – Kyle

+0

내 질문에 내 댓글에서 탐색 속성을 사용하여 언급했습니다. 탐색 속성을 사용하여 동일한 결과를 얻는 방법은 무엇입니까? 구체적으로, 'Count'속성을 검색합니다. 그룹화를해야합니까? 예를 보여줄 수 있습니까? – Kyle

+0

탐색 속성을 사용하면 EF가 이미 알고 있으므로 테이블을 조인하는 방법을 지정할 필요가 없습니다. 그것은 집계 함수이고 탐색 속성이 아니기 때문에 'Count'에 아무런 영향을 미치지 않습니다. – juharr

관련 문제