2010-06-22 3 views
0

У меня есть лицо, которое имеет отношения 1: N с Person_Addresses (поля: PersonID, AddressID, ValidFrom). Я хочу получить все Person записей и связанных с ними Person_Addresses только с последним ValidFrom. Как это сделать с помощью ObjectQuery или IQueryable?LINQ to Entites и ObjectQuery

Edit: я упомянул ObjectQuery и IQueryable, потому что я хотел бы иметь решение с использованием методов расширения (я думаю, что, как это называется). Также я забыл упомянуть, что я использую Entity Framework, где у меня есть сущности, сгенерированные. Я хочу получить объект person, у которого есть его person_adress участник с нетерпением загружены.

Вот структура лица: члены Person: Int ID, строка ПгвЬЫате, строка ФАМИЛИЯ, Partner_Address partneradress

члены Person_Address: int personid, int adressid, date validfrom

+0

Выглядит сложным, но должно быть? Генерируется SQL-должен выглядеть следующим образом: SELECT [Id] , [Имя] , [Фамилия] , prt.AdressID ОТ [Человек] р CROSS APPLY (\t Выбор TOP (1) [PersonId], [ AdressId], [ValidFrom] \t FROM [Person_Addresses] ра \t где р. [Id] = ра. [PersonId] \t ORDER BY [ValidFrom] DESC ) PRT – Sys

ответ

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

Ну я думаю, что вы получили представление о том, как я сделал это. Я не думаю, что это будет проблемой для вас, чтобы удовлетворить ваши требования. Вы можете взглянуть на Entites, на которых я уволил Linq. Он очень похож на ваш. Надеюсь, вы сможете продолжить дальше без особых хлопот. Все самое лучшее – 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? что-то вроде: PersonQuery.GroupJoin (... PersonAddressQuery ...) – Sys

Смежные вопросы