2013-02-20 3 views
0

테이블 타임 스탬프와 pable 프로젝트가 있습니다.SQL - Linq/EF/Lambda

최종 생성 된 타임 스탬프가있는 "Finished == false"열이있는 모든 프로젝트가 필요합니다.

내 currrent 코드 :

var result = from p in _contextProvider.Context.Projects 
        join t in _contextProvider.Context.Timestamps on p.Guid equals t.GuidProject 
        where p.Finished == false 
        orderby t.End 
        select new { p.Name, t.End }; 

방법 "프로젝트에 의해 최대 (t.Enc) 그룹의"를 만들기 위해? PS :. 내 나쁜 제목 죄송합니다,하지만 난

답변

0

좋아,이 까다로운 질문이다 :(사용하는 구문을 모르는 다음은 SQL에서 그것을 할 것입니다 방법이며 상대적으로 쉽다 :

난이도가 될 것입니다 Linq에로 변환
SELECT * 
FROM Projects p 
JOIN Timestamps t ON p.Guid = t.GuidProject 
WHERE p.Finshed = FALSE AND 
t.END = (
    SELECT max(t1.END) 
    FROM Projects p1 
    JOIN Timestamps t1 ON p1.Guid = t1.GuidProject 
    WHERE p.Finshed = FALSE AND p.Guid = p1.Guid 
) 

.이 내가 뭘하려하지만, 나는 그것을 테스트 할 수 있습니다.

 var baseQuery = _contextProvider.Context.Projects 
       .Join(_contextProvider.Context.Timestamps, p => p.Guid, t => t.GuidProject, (p, t) => new {p, t}) 
       .Where(o => o.p.Finished == false); 

     var result = baseQuery.Select 
      .Where(o => o.t.End == baseQuery 
          .Where(o2 => o2.p == o.p) 
          .Select(o2 => o2.t.End) 
          .Max() 
        ).Select(o => new {o.p.Name, o.t.End}); 

나는 그것을 조금 overcomplicated과는 group by 달성 할 수있다, 뭔가를 시도 할 수 있음 this :

 var result = (from p in _contextProvider.Context.Projects 
         join t in _contextProvider.Context.Timestamps on p.Guid equals t.GuidProject 
         where p.Finished == false 
         group t.End by p.Name into g 
         select new { name=g.Key, end=g.Max()}); 
+0

하지만 한 행만 표시됩니다. 각 프로젝트마다 하나의 행이 필요합니다. – spitzbuaamy

+0

@spitzbuaamy 편집을 확인하고, 나는 2 가지 버전을 제안했다. – Andrey

0

t.End로 내림차순으로 주문한 다음 첫 번째/첫 번째 또는 기본 결과 만 가져올 수 있습니다.