【问题标题】:LINQ to Entites and ObjectQueryLINQ to 实体和对象查询
【发布时间】:2011-03-06 16:01:54
【问题描述】:

我的 Person 实体与 Person_Addresses 有 1 : N 的关系(字段:PersonIDAddressIDValidFrom)。我想获取所有Person 记录和关联的Person_Addresses,只有最新的ValidFrom。我应该如何使用 ObjectQuery 或 IQueryable 来做到这一点?

编辑: 我提到了ObjectQueryIQueryable,因为我想有一个使用扩展方法的解决方案(我认为,它是如何被调用的)。另外我忘了提到我正在使用Entity Framework 来生成实体。我想得到一个 person 对象,它的 person_adress 成员急切地加载。

以下是实体结构: 个人成员:int id, string firstname, string lastname, Partner_Address partneradress

Person_Address 成员:int personidint adressiddate validfrom

【问题讨论】:

  • 看起来很复杂,但应该是吗?生成的 SQL 应如下所示: SELECT [Id] ,[Firstname] ,[Lastname] ,prt.AdressID FROM [Person] p CROSS APPLY ( SELECT TOP(1) [PersonId],[AdressId],[ValidFrom] FROM [ Person_Addresses] pa WHERE p.[Id] = pa.[PersonId] ORDER BY [ValidFrom] DESC ) prt

标签: linq-to-entities objectquery


【解决方案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
        };

我发现它可以很好地处理一些测试数据。

如有任何疑问,请告诉我。

【讨论】:

  • 嗯,我想你知道我是怎么做到的。我认为满足您的要求对您来说不是问题。你可以看看我已经解雇了 Linq 的 Entites。它看起来和你的很相似。希望您可以在没有太多麻烦的情况下继续前进。万事如意
  • 您好,这是一个经过测试的程序。您甚至可以继续使用一些示例。而且,为了便于理解,它已经被分成几部分。
  • 我碰巧遇到了这个帖子:stackoverflow.com/questions/584820/… 我想知道是否可以使用 groupjoin 加入 2 个不同的查询?类似于:PersonQuery.GroupJoin(... PersonAddressQuery ...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多