Удалите все элементы подписок, кроме последнего

Вопрос:

Привет всем, у меня есть список типов “Знак” (объект EF), у которого есть еще один список SignDataObject (другой объект EF). Мне нужно получить все знаки из db, содержащие только последний 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, а не повторять его позже?

Sign Entity:

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, я использовал свойство 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();

Оцените статью
TechArks.Ru
Добавить комментарий