首页 > 解决方案 > 如何使用 linq 从具有最新 dateTime 的集合中获取整个记录?

问题描述

我有一个实体,它有很多列,并且在一对多关系中具有到另一个实体的导航属性,现在在我的导航属性中我有一个 col dateTimeStamp,现在我想获取包括我的导航属性记录的记录,但只有那些具有最新的日期时间戳。我们如何使用 Lambda 表达式 linq 查询来做到这一点?

实体看起来像

public class EntityA {
   int entityAId {get;set;}
   string desc {get;set;}
   ...

   <ICollection<EntityB>> EntitiesB {get;set;}
}

public class EntityB {
   int entityAId {get;set;}
   int entityBId {get;set;}
   dateTime dateTimeStamp {get;set;}
   ...

   EntityA EntityANavi {get;set;}
}

}

因此,每个 EntityA 都有许多 EntityB,但我只想要具有最新 dateTime 的 EntityB 记录,如何使用 lambda 表达式和 linq 运算符来做到这一点?

数据看起来像: -

EntityA 
EntityAId  Desc     ...
 12         sample1
 22         sample2

EntityB
EntityBId  EntityAId  DateTimeStamp         ....
 1           12         2020-04-01-10:10:01
 1           12         2020-04-01-10:10:21
 1           12         2020-04-01-10:11:01
 2           22         2020-04-01-11:10:51
 2           22         2020-04-01-11:11:01

结果:一个对象

EntityA :{
   {entityAId : 12,
    desc: sample1
    ...
    EntitiesB :{
     EntityB:{ EntityAId:12, EntityBId :1, DateTimeStamp :2020-04-01-10:11:01  ....  } 
   },
   {entityAId : 22,
    desc: sample2
    ...
    EntitiesB :{
     EntityB:{ EntityAId:22, EntityBId :2, DateTimeStamp :2020-04-01-11:11:01  ....  } 
   }
 }

}

我尝试使用EntityA.Include( a => a.EntitiesB.orderByDescending(b => b.DateTimeStamp).First() ) 但我不断收到错误

标签: c#sqlentity-frameworklinqone-to-many

解决方案


我想获取包括我的导航属性记录在内的记录,但只获取具有最新 dateTimeStamp 的记录。

var entityAWithItsNewestEntityB = dbContext.EntitiesA.Select(entityA => new
{
    // Select the EntityA properties that you plan to use:
    Id = entityA.Id,
    Name = entityA.Name,
    ...

    NewestEntityB = entityA.EntitiesB
        .OrderByDescending(entityB => entityB.DateTimestamp)
        .Select(entityB => new
        {
             // Select only the EntityB properties that you plan to use
             Id = entityB.Id,
             Name = entityB.Name,
             ...

             // Foreign key not needed, you already know the value:
             // EntityeAId = entityB.EntityAId,
        })
        .FirstOrDefault(),
    });

换句话说:从 EntityA 对象集合中的每个 EntityA 对象中,选择一个或多个属性。还按 DateTimeStamp 的降序对该 EntityA 的所有 EntityB 对象进行排序,以使最新的 EntityB 排在第一位。从 EntityB 对象的这个有序序列中,选择几个属性。从结果中只取第一个,如果 EntityA 根本没有 EntityB 对象,则取 null。

简单的来吧您好!


推荐阅读