簡體   English   中英

LINQ Join從第二張表中獲取最新記錄

[英]LINQ Join to get latest record from 2nd table

問題:

它們是兩個表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表中獲取該特定電子郵件的最新記錄。

有任何想法嗎 ???

您可以只使用嵌套查詢而不是聯接:

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

我認為在這種情況下,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();

您可以嘗試這樣的事情:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM