2011-01-18 78 views
1

我有我的階級結構如下加快LINQ查詢

public class Email 
{ 
    public string Subject {get;set;} 
    public string Message {get;set;} 
    public Contact Sender {get;set;} 
    public string SenderEmail {get;set;} 
} 
public class Contact 
{ 
    public string Email {get;set;} 
    public string Name {get;set;} 
} 

,我跑我的Linq查詢兩個部分 首先我選擇的所有電子郵件。

var query = from msg in context.Email 
      select msg; 

然後我給你的聯繫方式,以電子郵件類

List<Email> outputList = new List<Email>(); 
foreach (var item in query.ToList()) 
{ 
    var q = from contact in context.Contact 
      where contact.Email = item.SenderEmail 
      select contact; 
    item.Sender = q.SingleOrDefault(); 
    outputList.Add(item); 
} 


return outputList; 

反正是有,我可以不必運行多個查詢

+0

爲什麼很多人寫了一些完全冗餘的東西,比如`from msg in context.Email選擇msg`而不是`context.Email`,然後抱怨它很慢? – Timwi 2011-01-18 22:54:57

回答

2

我認爲這會做的伎倆(警告:未經測試的代碼):

var qry = from email in context.Email 
       join contact in context.Contact 
       on email.SenderEmail equals contact.Email 
       into contacts 
       select new { eml = email, sender = contacts.FirstOrDefault() }; 

    var items = qry.ToList(); 

    foreach (var item in items) 
    { 
     item.eml.Sender = item.sender; 
     outputList.Add(item.eml); 
    } 

    return outputList; 
2

我懷疑運行連接查詢和簡單的輸出列表這應該工作:

var query = from msg in context.Email 
      join contact in context.Contact 
       on msg.SenderEmail equals contact.Email 
       into contacts 
      select new { msg, contacts }; 

var list = query.ToList(); 
foreach (var pair in list) 
{ 
    pair.msg.Sender = pair.contacts.FirstOrDefault(); 
} 

var messages = list.Select(pair => pair.msg); 

這使用組連接。你還沒說你使用的LINQ提供程序,但我相信它應該爲大多數提供商合作,......

+0

Argh,你打敗了我,但我不得不說我非常高興能拿出代碼接近Jon Skeet寫的東西。 :) – 2011-01-18 22:35:15