Оптимизация производительности для запроса LINQ в получателе свойств - PullRequest
0 голосов
/ 28 сентября 2018

Итак, у меня есть класс, который моделирует Sale, сделанный в магазине.Класс Sale имеет List из Payment.Класс продажи всегда имеет свойство под названием PointsPaid, которое использует LINQ для определения суммы сумм платежей, которые выплачиваются с помощью баллов лояльности.Вот как выглядит класс.

public class Sale
{
    private List<Payment> Payments {get;set;}

    public decimal PointsPaid
    {
        get
        {
            return Payments.Where(p => p.PaymentType == PaymentType.Points)
                           .Sum(p => p.Amount) * LoyaltyRate
        }
    }
}

Мой вопрос: есть ли способ достичь того же самого для PointsPaid без необходимости выполнять запрос LINQ каждый раз, когда я хочу получить сумму.Мне никогда не приходилось иметь дело с оптимизацией производительности, но это для реального клиента.

Каждый Sale объект, вероятно, будет когда-либо только один Payment, поэтому я также не уверен, будет ли в любом случае значительный спад производительности.

1 Ответ

0 голосов
/ 28 сентября 2018

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

public class Sale
{
    private List<Payment> Payments {get;set;}       // initialize in constructor
    private decimal _sumPointsAmount;
    public decimal LoyaltyRate { get; private set; } // set via constructor

    public decimal PointsPaid => _sumPointsAmount * LoyaltyRate;

    public void AddPayment(Payment p)
    {
        Payments.Add(p);
        if (p.PaymentType == PaymentType.Points)
            _sumPointsAmount += p.Amount;
    }
    public bool RemovePayment(Payment p)
    {
        bool removed = Payments.Remove(p);
        if(removed && p.PaymentType == PaymentType.Points)
            _sumPointsAmount -= p.Amount;
        return removed;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...