У нас есть список продуктов, по которым мы пытаемся получить количество продаж за определенный период.
Это не все продукты, и существует несколько способов их фильтрации, поэтому каждый из них является собственным методом, поэтому его можно оптимизировать для объединения меньшего числа таблиц, а затем передать IQuerable в основной метод main для выполнения тяжелых отмена получения всех необходимых нам деталей. Я не включил это, так как это большой код, который не нужен для создания проблемы.
(from bps in branchProductSeasons
join co in _db.CustomerOrders on bps.BranchID equals co.BranchID
into co2
from co3 in co2.Where(o => o.Timestamp >= startDate).DefaultIfEmpty(new CustomerOrder()) // Workaround to allow Moq to left join. It's not happy with a list of nulls
join col in _db.CustomerOrderLines
on new { CustomerOrderID = co3.ID, bps.ProductID } equals new { col.CustomerOrderID, col.ProductID }
into col2
from col3 in col2.DefaultIfEmpty()
where bps.SeasonID == seasonId
select new BranchProduct {
Id = bps.ProductID,
BranchId = bps.BranchID,
...
}
).ToList()
new CustomerOrder()
необходим в DefaultIfEmpty
для второго левого соединения с Работа. Без этого NullReferenceException бросается в тестах. Хотя код будет выполняться при компиляции.
Это не очень хорошее решение, так как результирующий набор будет содержать объект CustomerOrder для каждой записи, что означает, что для простых счетчиков теперь требуется равенство.
Также обратите внимание, что отметка времени Где должно быть в соединении, или результирующий набор будет подсчитывать элементы, если у них были продажи вне периода времени, а не внутри него.
Есть ли способ заставить Moq работать без установки значение для DefaultIfEmpty?