Как включить / заполнить свойство навигации с помощью настраиваемого (1-к-1) запроса в EF?
например
public class Item {
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey("Id")]
public ItemCost LatestCost {get; set; }
}
public class ItemCost {
public int Id { get; set; }
public DateTime From { get; set; }
public DateTime? To { get; set; }
public decimal Cost { get; set; }
}
Цель состоит в том, чтобы заполнить свойство LatestCost элемента последней стоимостью из ItemCosts. Как это достигается с помощью EF или как вы к этому относитесь?
Можно ли выполнить собственный запрос в методах .Include / .ThenInclude? например
.ThenInclude(a => { a.LatestCost = (from a _db.ItemCosts
where... select a).SingleOrDefault() })...

Вы можете использовать виртуальное свойство только для получения. Ваше свойство навигации действительно должно быть ICollection<ItemCost>. В этом примере я предполагаю, что свойство Id в классе ItemCost является идентификатором соответствующего Item, но это не ясно. Совет: использование nameof(property) вместо жесткого кодирования имени свойства позволит компилятору обнаруживать ошибки с именем, если вы по какой-то причине его изменили. Атрибут [NotMapped] сообщает Entity Framework не пытаться сопоставить свойство с полем базы данных.
public class Item {
public int Id { get; set; }
public string Name { get; set; }
public ICollection<ItemCost> ItemCosts {get; set; }
[NotMapped]
public virtual ItemCost LatestCost
{
get
{
return ItemCosts.OrderByDescending(x => x.From).FirstOrDefault();
}
}
}
public class ItemCost {
public int Id { get; set; }
public DateTime From { get; set; }
public DateTime? To { get; set; }
public decimal Cost { get; set; }
[ForeignKey(nameof(Id))]
public virtual Item Item { get; set; }
}
У меня это работает. Подсказки тоже хорошие. Спасибо.
Требуется ли для этого решения, чтобы коллекция ItemCosts была полностью извлечена из базы данных, чтобы получить последнюю информацию о стоимости?
@Codemunkie нет, это приведет к запросу SELECT TOP 1....
Попробую позже. Спасибо.