Пара вещей:
Когда вы заявляете: не работает, вы получаете ордер обратно, но цифра в $ равна 0,0, когда вы ожидаете другое значение? Похоже, у вас есть записи порядка 2х, но исходя из того, что возвращается, вы ожидаете ненулевое число, обе записи ненулевые? В представлении отладки разверните «Заказы» во всплывающем контекстном меню, это покажет, какие сведения о заказах загружены EF.
Во-первых, вы должны быть осторожны при использовании методов "OrDefault". Ваш код предполагает, что значение возвращается. В этих случаях лучше использовать Single()
или First()
в зависимости от ситуации.
Кроме того, при использовании First
вы должны указать условие OrderBy
, чтобы обеспечить надежный порядок.
SaveChanges
Должен вызываться только при изменении данных.
Наконец, отложенная загрузка - это возможность загрузки редко используемых данных по требованию. Вы должны в значительной степени работать, чтобы не полагаться на вызовы с отложенной загрузкой. Если вам нужны целые объекты, и вы знаете, что собираетесь использовать заказы, то загружайте их.
1018 * Т.е. *
using (var context = new EfContext())
{
var customer = context.Customers
.Include(c => c.Orders)
.Single(c => c.CustomerId = customerId);
// Do stuff...
}
Если вы хотите только 1 применимый заказ для данного сотрудника, рассмотрите возможность использования Select
для его получения:
1024 * Т.е. *
using (var context = new EfContext())
{
var data = context.Customers.Where(c => c.CustomerId = customerId)
.Select(c => new { Customer = c, FirstOrder = c.Orders.OrderBy(o => o.OrderDate).FirstOrDefault()})
.Single();
// Do Stuff...
}
Это даст вам анонимный тип, содержащий клиента (без необходимости загружать заказы) и соответствующий первый заказ.
Лучше всего просто использовать Select
, чтобы получить нужные поля от клиента и заказа (ов). Это уменьшает объем данных (строк и столбцов), извлекаемых из базы данных.