Nested Left Join в Linq не может смоделировать список объектов - PullRequest
1 голос
/ 13 марта 2020

У нас есть список продуктов, по которым мы пытаемся получить количество продаж за определенный период.

Это не все продукты, и существует несколько способов их фильтрации, поэтому каждый из них является собственным методом, поэтому его можно оптимизировать для объединения меньшего числа таблиц, а затем передать 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?

...