2010-06-22 39 views
0

我有與Person_Addresses(字段:PersonID,AddressID,ValidFrom)有1:N關係的Person實體。我想獲得所有Person記錄和關聯Person_Addresses只有最新的ValidFrom。我應該如何使用ObjectQuery或IQueryable來做到這一點?LINQ到Entites和ObjectQuery

編輯: 我提到ObjectQueryIQueryable,因爲我想有使用擴展方法(我想,那它是如何稱呼)的解決方案。另外我忘了提及我在使用Entity Framework的地方生成實體。我想獲得一個person_adress成員熱切加載的person對象。

這裏是實體結構: 人成員:INT ID,串名字,姓氏字符串,Partner_Address partneradress

Person_Address成員:int personidint adressiddate validfrom

+0

看起來很複雜,但應該是?生成的SQL應該是這樣的: SELECT [ID] ,[姓名] ,[姓氏] ,prt.AdressID FROM [人] p CROSS APPLY (\t SELECT TOP(1)[PERSONID],[ AdressId],[ValidFrom] \t FROM [Person_Addresses] PA \t其中,p。[ID] = PA。[PERSONID] \t ORDER BY [ValidFrom] DESC )PRT – Sys 2010-06-23 08:13:21

回答

1

嘗試以下。

我有以下實體。

//Person Entity 
    public class Person 
    { 
     public int PersonID { get; set; } 
     public string PersonName { get; set; } 
    } 

    //PersonAddress Entity 
    public class PersonAddress 
    { 
     public int PersonID { get; set; } 
     public int AddressID { get; set; } 
     public DateTime ValidFrom { get; set; } 
    } 

然後激發以下查詢。

//Get the latest ValidFrom for each person from PersonAddress. 
    var getLatestDateRecords = 
    from p in lstPersonAddress 
    group p by p.PersonID into g 
    select new 
    { 
     Infos = 
      (from PA in g 
      select new 
      { 
       PersonId = PA.PersonID 
       Date = g.Max(t=>t.ValidFrom) 
      }).Distinct() 
    }; 

    //Segregate the ValidFroms and PersonId from the 
    //previous record set(getLatestDateRecords). 
    var segRecords = 
     from x in getLatestDateRecords 
     from y in x.Infos 
     select new { Date = y.Date, PersonId = y.PersonId }; 

    //Obtain all the relevant information from the PersonAddress 
    // for the latest ValidFrom dates. 
    var allValidRecords = 
     from PA in lstPersonAddress 
     join x in segRecords 
     on PA.ValidFrom equals x.Date 
     where PA.PersonID == x.PersonId 
     select new { 
       PersonId = PA.PersonID 
       , AddressId = PA.AddressID 
       , Date = PA.ValidFrom 
      }; 

    //Get the final result 
    var resultSet = 
     from p in lstPerson 
     join x in allValidRecords 
     on p.PersonID equals x.PersonId 
     select new 
     { 
      PersonId = p.PersonID 
      ,PersonName = p.PersonName 
      ,AddressId = x.AddressId, 
      Date = x.Date 
     }; 

我發現它與一些測試數據工作正常。

如有任何問題,請告知我。

+0

嗯,我認爲你有這個想法如何我做過某事。我認爲這對你來說不適合你的要求。你可以看看我已經解僱Linq的Entites。它看起來和你的非常相似。希望你可以繼續下去,沒有太多的無用之分。所有最好 – 2010-06-23 06:35:45

+0

嗨,這是一個測試程序。你甚至可以繼續做一些示例。更多的是,爲了理解,它已經完成了。 – 2010-06-23 08:48:39

+0

我恰巧來accros這個線程:http://stackoverflow.com/questions/584820/how-do-you-perform-a-left-outer-join-using-linq-extension-methods/584836#584836 我想知道是否有可能使用groupjoin加入2個不同的querys?類似於:PersonQuery.GroupJoin(... PersonAddressQuery ...) – Sys 2010-06-24 09:33:24