删除子列表的所有元素,最后一个除外
本文关键字:最后一个 元素 列表 删除 | 更新日期: 2023-09-27 18:14:26
大家好,我有一个类型为"Sign"的列表(EF实体),它有另一个列表的SignDataObject(另一个EF实体)。我需要从数据库中检索仅包含最后一个SignDataObject的所有标志(基于时间戳(这是一个日期时间))。
现在我想采取步骤,并这样做,以检索我所有的标志(与所有的signdataobject在其中):
var signs = context.Signs
.Include("SignDataObjects")
.Where(s => s.Customer.Email.ToLower().Equals(email.ToLower()))
.ToList();
然后我想遍历每个标志的signdataobject并删除除最后一个之外的所有子对象。
我试着这样做,但没有工作:
foreach (var sign in signs){
sign.SignDataObjects.ToList().RemoveRange(0, Math.Max(0, sign.SignDataObjects.Count-1));
}
然后我试着用更多的步骤来做,像这样:
foreach (var sign in signs)
{
//sign.SignDataObjects.ToList().RemoveRange(0, Math.Max(0, sign.SignDataObjects.Count-1));
var sdol = sign.SignDataObjects.ToList();
sdol.RemoveRange(0, Math.Max(0, sdol.Count - 1));
sign.SignDataObjects = sdol;
}
并且成功了
我无法删除子列表的孩子,而迭代它,所以我问,有没有一个更快/更好的方法来做到这一点?也许在一开始,当我检索我的标志,我可能能够检索他们已经包括只最后的signobjectdata直接,而不是通过它迭代以后?
实体:
public Sign()
{
this.SignDataObjects = new HashSet<SignDataObject>();
}
public string SensorID { get; set; }
public string Description { get; set; }
public string RefSignType { get; set; }
public int RefCustomerID { get; set; }
public virtual Customer Customer { get; set; }
public virtual SignType SignType { get; set; }
public virtual ICollection<SignDataObject> SignDataObjects { get; set; }
SignDataObject:
public int ID { get; set; }
public double Lat { get; set; }
public double Lon { get; set; }
public System.DateTime Timestamp { get; set; }
public string Orientation { get; set; }
public int SensorBattery { get; set; }
public string RefSignID { get; set; }
public virtual Sign Sign { internal get; set; }
试试这个,如果它工作,我使用TimeStamp
属性来确定它是集合中的最后一个SignDataObject
。
var signs = context.Signs
.Include(s => s.SignDataObjects)
.Where(s => s.Customer.Email.ToLower().Equals(email.ToLower()))
.Select(s => new
{
Sign = s,
SignDataObjects = s.SignDataObjects.OrderByDescending(sdo => sdo.Timestamp).Take(1)
})
.ToArray()
.Select(s => s.Sign)
.ToArray();