2010-07-05 132 views
0

我有這樣的SQL,我想已經寫在LINQ擴展方法返回從我的EDM實體:EF和LINQ擴展方法

SELECT p.[Id],p.[Firstname],p.[Lastname],prt.[AddressId],prt.[Street],prt.[City] 
FROM [Person] p 
CROSS APPLY ( 
    SELECT TOP(1) pa.[AddressId],a.[ValidFrom],a.[Street],a.[City] 
    FROM [Person_Addresses] pa 
    LEFT OUTER JOIN [Addresses] AS a 
    ON a.[Id] = pa.[AddressId] 
    WHERE p.[Id] = pa.[PersonId] 
    ORDER BY a.[ValidFrom] DESC) prt 

也可以這樣使用重新寫在LINQ擴展方法3加入?

回答

0

假設你已經設置Person_Addresses表了作爲一個純粹的關係表(即沒有數據之外的外鍵),這應該做的伎倆:

var persons = model.People 
     .Select(p => new { p = p, a = p.Addresses.OrderByDescending(a=>a.ValidFrom).First() }) 
     .Select(p => new { p.p.Id, p.p.Firstname, p.p.LastName, AddressId = p.a.Id, p.a.Street, p.a.City }); 

的第一選擇()訂單的地址和選擇最新的一個,第二個返回一個匿名類型,其中包含查詢中指定的屬性。

如果你的關係表中有更多的數據,你將不得不使用連接,但這種方式你可以從它們中解脫出來。在我看來,這更容易閱讀。

注意:如果人員中的任何條目沒有連接到他們的地址,您可能會遇到異常,但我沒有嘗試過。

+0

感謝您的迴應,但是我正在尋找另一種解決方案,其中查詢返回的不是投影。 – Sys 2010-07-07 11:48:56

+0

我不確定你在找什麼樣的查詢;你的意思是你只是想要個人實體和(每個人)他們的最新地址? – 2010-08-12 11:00:47