3

問題:

それらは、TableEmailsとTableSentEmailRecordsの2つのテーブルです。したがって、電子メールが送信されるたびに、送信時間などのレコードが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 に答える