大家好我有一个类型为“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; }
答案 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();