3

问题:

它们是两个表 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 表中获取该特定电子邮件的最新记录。

有任何想法吗 ???

4

3 回答 3

5

您可以只使用嵌套查询而不是连接:

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)
            };
于 2012-07-22T20:07:13.707 回答
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();
于 2012-07-23T00:58:27.513 回答
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();
于 2012-07-22T20:04:53.350 回答