LINQ to Entites и ObjectQuery - PullRequest
       29

LINQ to Entites и ObjectQuery

0 голосов
/ 22 июня 2010

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

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

Вот структура объектов: Участники Person: int id, имя строки, фамилия строки, Партнер_адрес partneradress

Участники Person_Address:int personid, int adressid, date validfrom

1 Ответ

1 голос
/ 22 июня 2010

Попробуйте следующее.

У меня есть следующие сущности.

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

Я обнаружил, что он работает нормально с некоторыми тестовыми данными.

Дайте мне знать, если у вас возникнут вопросы.

...