Группировать и суммировать несколько столбцов - PullRequest
1 голос
/ 03 июля 2019

У меня есть следующий SQL-запрос, и я хотел бы преобразовать его в лямбда-выражение:

SELECT TOP 10 SUM(Quantity * Price) AS Quantity, Category 
FROM InvoiceItem 
WHERE Unit = 'Hour' 
GROUP BY Category 
ORDER BY Quantity DESC

Я пробовал много вещей, но я не понимаю, что с этим не так:

var data = _db.InvoiceItem.Where(where => where.Unit == "Hour")
                          .GroupBy(group => new { group.Category })
                          .Select(group => new
                          {
                              Category = group.Key.Category,
                              Quantity = group.Sum(s => s.Quantity * s.Price)
                          })               
                          .OrderByDescending(ob => ob.Quantity)
                          .Take(10);

К сожалению, я получаю следующую ошибку:

Message = "Данные имеют значение Null. Этот метод или свойство нельзя вызывать для значений Null."

Вот моя модель:

namespace Accounts.Models
{

    public enum UnitList
    {
        Hour, Each, Km, Bag
    }

    public class InvoiceItem
    {

        public InvoiceItem()
        {
            Price = 0;
            Quantity = 1;          
            Unit = UnitList.Each.ToString();
            Display = false;
        }

        [Key]
        public int InvoiceItemID { get; set; }

        [Required]
        public int InvoiceID { get; set; }

        [Required]
        public int PersonID { get; set; }

        [Required]
        public Guid UserID { get; set; }

        [Required]        
        [DataType(DataType.Date)]
        //[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? Date { get; set; }

        [StringLength(50)]
        public string Category { get; set; }

        [StringLength(50)]
        public string Aircraft { get; set; }

        [Required]
        [StringLength(200)]
        public string Description { get; set; }

        [Required]
        [StringLength(20)]
        public string Unit { get; set; }     

        [Required]
        [DataType(DataType.Currency)]
        [DisplayFormat(ApplyFormatInEditMode = false, DataFormatString = "{0:c}")]
        public decimal Price { get; set; }

        [Required]
        [DefaultValue(1)]
        public decimal? Quantity { get; set; }

        [UIHint("Boolean")]
        public Boolean Display { get; set; }

        public virtual Invoice Invoice { get; set; }

        public virtual Person Person { get; set; }        
    } 


}

1 Ответ

2 голосов
/ 03 июля 2019

Скорее всего, вы получаете данные, где Category равно null.Поэтому вам нужно добавить дополнительное условие в Where.Также вы можете немного упростить GroupBy:

_db.InvoiceItem.Where(i => i.Unit == "Hour" && i.Category != null)
                      .GroupBy(i => i.Category)
                      .Select(i => new
                      {
                          Category = i.Key.Category,
                          Quantity = i.Sum(s => s.Quantity * s.Price)
                      })               
                      .OrderByDescending(i => i.Quantity)
                      .Take(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...