Сумма Продукта из 2 столбцов + Продукт еще двух столбцов в Свойствах навигации Entity Framework - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь написать заявление, чтобы получить сумму двух полей продукта в Entity Framework.

Учитывая следующую структуру:

public class Order
{
    public int OrderNUmber {get; set;}
    public virtual List<Orderline> OrderLines {get; set;}
    public virtual List<ServiceLine> ServiceLines {get; set;}
    public string someproperty {get; set;}
}

public class OrderLine
{
    public string productname {get; set;}
    public int quantity {get; set;}
    public decimal price {get; set;}
}

public class ServiceLine
{
    public string servicename {get; set;}
    public int quantity {get; set;}
    public decimal rate {get; set;}
}

Я пытаюсь вернуть суммустоимость заказа в одном запросе:

var GrandTotal = Orders.Where(q => q.someproperty == "somecondition")
                 .Sum(order =>
                           order.OrderLines.Sum(line => line.quantity * line.price) 
                         + order.ServiceLines.Sum(sl =>sl.quantity * sl.rate));

Однако эта версия не дает правильной суммы. Число намного меньше, чем ожидалось.

1 Ответ

0 голосов
/ 06 ноября 2019

Таким образом, проблема заключалась в том, что EF получал нулевое значение для любого ордера, у которого не было служебных линий, вместо добавления нуля.

Обе эти опции работают:

 .Sum(
                order =>
                       order.OrderLines.Select(n => new{n.quantity, n.price}).DefaultIfEmpty(new {quantity = 0, price = decimal.Zero}).Sum(line => line.quantity * line.price) + order.ServiceLines.Select(n => new{n.quantity, n.rate}).DefaultIfEmpty(new {quantity = 0, rate = decimal.Zero}).Sum(acl =>acl.quantity * acl.rate) 
                );

AND

.Sum(
                order =>
                    order.OrderLines.Select(lines => new { LineTotal = lines.quantity * lines.price }).DefaultIfEmpty(new { LineTotal = Decimal.Zero }).Sum(x => x.LineTotal) + order.ServiceLines.Select(acl => new { AclTotal = acl.quantity * acl.rate }).DefaultIfEmpty(new { AclTotal = Decimal.Zero }).Sum(x => x.AclTotal)
            );

Необходимо указать EF значение DefaultIfEmpty для анонимного объекта, в противном случае это будет добавление к нулю. Таким образом, EF получит OrderLineTotal (значение) + ServiceLineTotal (NULL) = NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...