2012-07-22 91 views
2

问题:LINQ加入从第二张表中获取最新记录

他们是两张表TableEmails和TableSentEmailRecords。因此,当发送电子邮件时,诸如发送时间等的记录存储在TableSentEmailRecords中。

我想要做一个LINQ查询,它使TableEmails的列加上TableSentEmailRecords中的“SentDate”列,显示电子邮件发出的最新日期。

我尝试这样做:

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(); 

但这不一定得到TableSentEmailRecords表中特定电子邮件的最新记录。

任何想法?

回答

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,我想使用该记录其他值来填充我的查询中的其他几个属性。我可以那样做吗? – 2012-07-22 23:35:29

+0

@aDev我在回答中添加了关于此的详细信息。 – MikeKulls 2012-07-23 22:25:14

1

我觉得群组加入是在这种情况下,正确的方法。使用子查询将起作用,但效率不会很高。对不起,我不知道更简单的查询语法,特别是我不知道如何执行组加入。也许有人可以翻译。

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();