2012-07-22 2 views
2

문제 :LINQ 두 번째 테이블에서 최신 레코드 얻기

두 테이블 TableEmails 및 TableSentEmailRecords가 있습니다. 따라서 이메일이 발송 될 때, 보낸 시간 등과 같은 레코드는 TableSentEmailRecords에 저장됩니다.

TableEmails의 열에 TableSentEmailRecords의 "SentDate"열을 더한 LINQ 쿼리를 보내고 싶습니다.이 열은 전자 메일이 발송 된 최신 날짜를 표시합니다. 반드시 TableSentEmailRecords 테이블에서 특정 전자 메일의 최신 기록을하지

List<CustomEmail> emails = new List<CustomEmail>(); 

var query = from c in db.TableEmails 
      join o in db.TableSentEmailRecords on c.EmailId equals o.EmailId 
         select new CustomEmail 
         { 
          EmailName = c.EmailName, 
          EmailId= c.EmailId, 
          EmailDescription = c.EmailDescription, 
          LastDateEmailSentOut = o.SentDate 
         }; 

emails = query.ToList(); 

그러나이 : ​​

나는이 시도.

어떤 아이디어 ???

답변

0

당신은 이런 식으로 뭔가를 시도 할 수 있습니다 :

var query = (from c in db.TableEmails 
      join o in db.TableSentEmailRecordson c.EmailId equals o.EmailId 
      select new CustomEmail 
      { 
       EmailName = c.EmailName, 
       EmailId = c.EmailId, 
       EmailDescription = c.EmailDescription, 
       LastDateEmailSentOut = o.SentDate 
      }).OrderByDescending(c => c.LastDateEmailSentOut).ToList(); 
2

당신은 단지 대신 조인의 중첩 된 쿼리를 사용할 수 있습니다

var query = from c in db.TableEmails 
      select new CustomEmail 
      { 
       EmailName = c.EmailName, 
       EmailId= c.EmailId, 
       EmailDescription= c.EmailDescription, 
       LastDateEmailSentOut = db.TableSentEmailRecordson 
             .Where(x => x.EmailId = c.EmailId) 
             .Max(x => x.SentDate) 
      }; 
+0

감사합니다 ...이 작동 할 수 있습니다 ... 그냥 다른 지점 (죄송합니다 내가 언급하는 것을 잊었습니다) ... 동일한 (최대) 기록 누구의 데이트 내가으로 사용됩니다 LastDateEmailSentOut, 그 레코드를 다른 값을 내 쿼리에서 몇 가지 다른 속성을 채우는 데 사용하고 싶습니다. 내가 할 수 있을까? –

+0

@aDev이 답변에 대한 자세한 내용을 추가했습니다. – MikeKulls

1

을 나는 GroupJoin이 경우 올바른 방법이라고 생각합니다. 하위 쿼리를 사용하면 효과적 일 것입니다. 죄송합니다, 나는 더 간단한 쿼리 구문을 잘 모르며, 특히 그룹 가입 방법을 모르겠습니다. 어쩌면 누군가 번역 할 수 있습니다.

db.TableEmails.GroupJoin(db.TableSendEmailRecordson, 
    o => o.EmailID, 
    i => i.EmailID, 
    (o, i) => new 
    { 
    EmailName = c.EmailName, 
    EmailId= c.EmailId, 
    EmailDescription= c.EmailDescription, 
    LastDateEmailSentOut = i.Max(x => x.SentDate) 
    }) 

는이 같은 뭔가를 할 수 TableSendEmailRecordson에서 모든 세부 사항을 얻으려면 :

db.TableEmails.GroupJoin(db.TableSendEmailRecordson, 
    o => o.EmailID, 
    i => i.EmailID, 
    (o, i) => new 
    { 
    EmailName = c.EmailName, 
    EmailId= c.EmailId, 
    EmailDescription = c.EmailDescription, 
    LastSendEmailRecordson = i.FirstOrDefault(y => y.SentDate == i.Max(x => x.SentDate)) 
    }) 
그 다음 경우에 해당하는지 먼저 데이터를 얻을 필요, SQL로 번역 것에 대해 불평 할 수

예 :

var emails = db.TableEmails.ToArray(); 
var emailSend = db.TableSendEmailRecordson.ToArray(); 
관련 문제