次のデータベースがあります。
テーブル メッセージ:
- 送信されたメッセージを保存する責任は、さまざまな電子メール アドレスに送信されます。
テーブルの電子メール:
- メールアドレス (主キー = Email) の保存のみを担当します (toEmail はテーブル email と関係があります) (Sotres Foo@gmail.com、Foo2@gmail.com など...)
テーブルの連絡先:
- ユーザーの連絡先を保存するために使用されます。(マーク、ジョン、トムなどを保存します...)
表 ContactEmails
- 連絡先は複数の電子メール アドレスを持っている可能性があるため、このテーブルが必要です。(テーブル Emails で見つかった ID を格納します)
とにかくここに質問があり ます。特定の日付に送信されたすべてのメッセージを選択するクエリを作成したいと考えています。連絡先名が存在する場合は、クエリに含めたいと思います。次のクエリを作成しましたが、低速です。
Func<string, Contact> tryGetContact = (email)=>{
var contactEmail = db.ContactEmails.FirstOrDefault(x=>x.IdEmail==email);
if(contactEmail==null)
return null;
return contactEmail.Contact; // navigational property created by entity framework.
};
var query = from msg in db.Messages
join email in db.Emails on msg.ToEmail equals email.Email
where msg.Date < "some date" && msg.Date > "some other date"
select new
{
MessageSubject = msg.Subject,
ToEmail = email.Email,
Contact = tryGetContact(email.Email) // this slows down the query!
};
クエリを高速に実行するには、すべての連絡先を辞書に保存し、このクエリを 2 つのクエリに分ける必要がありますか?
すべての連絡先を辞書に保存すると、作業がはるかに効率的になります。しかし、ほとんどの連絡先を必要としないデータベースからすべての連絡先を取得すると、リソースを無駄にしているように感じます。