2010-01-21 25 views
1

我正在學習實體框架,我試圖讓下面的場景工作。幫助Linq實體簡單的子查詢

我有一個Person類和一個Message類。消息類具有兩個Person類型的From屬性和To屬性。我想使用Linq to Entities檢索消息列表。我的數據庫表是消息和個人。消息具有類型爲int的列From和To指向Person表的PK ID。

下面是我到目前爲止填充可查詢消息列表的代碼。所以我的問題是加載人員數據。我怎樣才能以最有效的方式去做這件事。任何有關該方法的解釋將不勝感激。

var messages = from m in _entities.Message 
          select new BizObjects.Message 
          { 
           MessageId = m.MessageId, 
           From = new BizObjects.Person 
           { 
            PersonId = m.From 
           }, 
           To = new BizObjects.Person 
           { 
            PersonId = m.To 
           }, 
           Subject = m.Subject, 
           Content = m.Content, 
           Read = m.Read, 
           CreatedOn = m.CreatedOn, 
          }; 

如果您需要更多的代碼或背景信息,請讓我知道。在此先感謝您的幫助。

回答

1

您應該有associationsMessagePerson之間。由於EF設計師自動創建它們,您可能已經做到了。但是,由於它們將從外鍵而不是從列名生成,所以自動創建的關聯可能使用不太有用的名稱創建,如Message.Person1或其他。您可以在設計器中選擇它們,並將它們重命名爲更有用的名稱。

假設您的關聯被稱爲Message.FromPersonMessage.ToPerson。然後,您就可以寫這樣的查詢:

 var messages = from m in _entities.Message 
         select new BizObjects.Message 
         { 
          MessageId = m.MessageId, 
          From = new BizObjects.Person 
          { 
           PersonId = m.FromPerson.PersonId, 
           PersonName = m.FromPerson.PersonName 
          }, 
          To = new BizObjects.Person 
          { 
           PersonId = m.ToPerson.PersonId, 
           PersonName = m.ToPerson.PersonName 
          }, 
          Subject = m.Subject, 
          Content = m.Content, 
          Read = m.Read, 
          CreatedOn = m.CreatedOn, 
         }; 

通過我的LINQ使用關聯屬性到實體查詢,我造成實體框架音譯此引用到SQL一個LEFT OUTER JOIN

這是一種非常有效的加載數據的方式(特別是與延遲加載相反,這會導致多列數據庫查詢),因爲您只選擇實際需要的列,並且它們都在一個查詢。