删除子列表的所有元素,最后一个除外

本文关键字:最后一个 元素 列表 删除 | 更新日期: 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();