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

时间:2014-07-23 11:18:43

标签: c# linq entity-framework list linq-to-entities

大家好我有一个类型为“Sign”(EF实体)的列表,它有另一个SignDataObject列表(另一个EF实体)。我需要从包含最后一个SignDataObject的db中检索所有符号(基于时间戳(这是一个日期时间)。

现在我想采取步骤并做到这一点来检索我的所有迹象(其中包含所有signdataobjects):

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

1 个答案:

答案 0 :(得分:1)

尝试此操作如果有效,我使用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();