2010-06-22 3 views
0

J'ai entité Person qui a une relation 1: N avec Person_Addresses (champs: PersonID, AddressID, ValidFrom). Je veux obtenir tous les enregistrements Person et associés Person_Addresses avec seulement le dernier ValidFrom. Comment dois-je faire cela en utilisant ObjectQuery ou IQueryable?LINQ to Entites et ObjectQuery

Edit: je l'ai mentionné ObjectQuery et IQueryable, parce que je voulais avoir une solution en utilisant des méthodes d'extension (je pense que la façon dont on l'appelle). Aussi j'ai oublié de mentionner que j'utilise Entity Framework où j'ai les entités générées. Je veux obtenir un objet personne dont le membre person_adress est chargé.

Voici la structure des entités: membres id personne: int, prenom string, string lastname, Partner_Address partneradress

membres Person_Address: int personid, int adressid, date validfrom

+0

Cela semble compliqué mais devrait-il être? Le SQL généré doit ressembler à ceci: SELECT [Id] , [Prénom] , [Nom] , prt.AdressID de [personne] p CROSS APPLY (\t SELECT TOP (1) [personID], [ AdressId], [ValidFrom] \t dE [Person_Addresses] pa \t où p. [Id] = pa. [personID] \t ORDER BY [ValidFrom] DESC ) PRT – Sys

Répondre

1

Essayez ce qui suit.

J'ai les entités suivantes.

//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; } 
    } 

Ensuite, lancez la requête suivante.

//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 
     }; 

J'ai trouvé que cela fonctionnait correctement avec certaines données de test. Informez-moi en cas de doute.

+0

Eh bien, je pense que vous avez eu l'idée que la façon dont je fait ça. Je ne pense pas que ce sera un problème pour vous de répondre à vos besoins. Vous pouvez jeter un oeil dans les Entités sur lesquelles j'ai tiré le Linq. Cela ressemble beaucoup à la tienne. J'espère que vous pouvez aller plus loin sans trop de hassel. Tout le meilleur –

+0

Salut, c'est un programme testé. Vous pouvez même aller de l'avant avec un échantillon. Et plus encore, il a été fait en morceaux pour la compréhension. –

+0

Je suis arrivé à venir accros ce fil: http://stackoverflow.com/questions/584820/how-do-you-perform-a-left-outer-join-using-linq-extension-methods/584836#584836 Je me demande s'il est possible de joindre 2 requêtes différentes en utilisant groupjoin? quelque chose comme: PersonQuery.GroupJoin (... PersonAddressQuery ...) – Sys