2010-08-03 61 views
1

我想構建我的linq-to-sql表達式,以便它只生成單個SQL數據庫查詢。該查詢涉及兩個嵌套選擇,一個簡化版本是:構建嵌套的linq-to-sql表達式以生成單個SQL查詢

var query = from person in People 
      where person.ID == 1234 
      select new PersonDetails() 
      { 
       ID = person.ID, 
       FirstName = person.FirstName, 
       LastName = person.LastName, 
       Addresses = from address in Addresses 
          where address.PersonID == person.ID 
          select address 
       PhoneNumbers = from number in PhoneNumbers 
           where number.PersonID == person.ID 
           select number 
      } 

該表達式將導致兩個SQL查詢被執行。第一個加入Person和PhoneNumbers表,並從它們中提取所需的信息。第二個查詢是來自Addresses表的簡單選擇。如果我註釋掉電話號碼屬性,那麼只有一個連接人員和地址的查詢會被執行,因此L2S引擎確實可以識別這兩個關係。

有沒有人有任何想法我可以如何構建LINQ表達式,以便linq-to-sql只會生成一個單一的SQL查詢?

回答

1
     (from person in Persons 
         join address in Addresses 
         on person.id equals address.personid 
         join phone in PhoneNumbers 
         on person.id equals phone.personid 
         select new 
         { 
          Person = person, 
          Address = address, 
          Phone = phone 
         }) 
         .GroupBy(p => p.Person.id) 
         .Select(g => new 
         { 
          Person = g.FirstOrDefault().Person, 
          Addresses = g.Select(k=>k.Address).Distinct(), 
          PhoneNumbers = g.Select(k=>k.Phone).Distinct() 
         }); 
+0

這似乎是混合查詢表達式與擴展方法。有沒有什麼方法可以用查詢表達式來實現呢? – Jacques 2017-02-14 13:06:56

1

您可以使用 「讓」 的文章:

from person in context.Persons 
. 
. 
let Add = from address in Addresses 
          where address.PersonID == person.ID 
          select address 

這確實一個子查詢。

+0

看起來L2S在let語句周圍有一些智慧。如果我在我的linq表達式中使用兩個let語句,它仍然以兩個單獨的SQL查詢結束,其中第一個使用左外連接來處理let。 – sipwiz 2010-08-04 00:56:00