Группировать по дюймам net ядро ​​3.1 - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь сгруппировать по 2 полям, а затем подсчитывать строки каждого статуса. Я использую. NET core 3.1 и новейшую версию EF.

Я получаю сообщение об ошибке: не удалось перевести выражение LINQ. Либо перепишите запрос в форме, которая может быть переведена ...

До сих пор я исследовал, когда я избавляюсь от предиката y.Count (x => x.Status == "New ") и просто оставьте y.Count () , все работает нормально.

Коллекция заказов - это просто фиктивный список объектов, в моем реальном приложении это таблица в sql server.

//Rextester.Program.Main is the entry point for your code. Don't change it.
//Microsoft (R) Visual C# Compiler version 2.9.0.63208 (958f2354)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var orders = new List<Order>();
            orders.Add(new Order(){Year = 2020, Status = "New"});
            orders.Add(new Order(){Year = 2020, Status = "New"});
            orders.Add(new Order(){Year = 2020, Status = "Canceled"});
            orders.Add(new Order(){Year = 2020, Status = "Shipped"});            

            
            var result = await orders
                .GroupBy(x=> new {x.Year, x.Status})
                .Select(y => new 
                {   
                    Year = y.Key.Year,
                    NewCount = y.Count(x=>x.Status == "New"),
                    CanceledCount = y.Count(x=>x.Status == "Canceled"),
                    ShippedCount = y.Count(x=>x.Status == "Shipped")                          
                }).ToListAsync();
        }
    }
    public class Order
    {
        public int Year {get;set;}
        public string Status {get;set;}
    }
}

Ожидаемый результат:

Год: 2020, NewCount: 2

Год: 2020, CanceledCount: 1

Год: 2020, ShippedCount: 1

Что я делаю не так? Как исправить эту ошибку, чтобы получить желаемый результат?

РЕДАКТИРОВАТЬ: Это моя игровая площадка https://dotnetfiddle.net/v7IYmq

1 Ответ

1 голос
/ 14 июля 2020

Можете попробовать следующее. Вы уже группируете по году и статусу. Статус - это часть вашего ключа, поэтому вы можете использовать это в своих интересах. Затем просто подсчитайте записи, используя y.Count()

using System;
using System.Collections.Generic;
using System.Linq;
                    
    public class Program
    {
        public static void Main(string[] args)
        {
            var orders = new List<Order>();
            orders.Add(new Order(){Year = 2020, Status = "New"});
            orders.Add(new Order(){Year = 2020, Status = "New"});
            orders.Add(new Order(){Year = 2020, Status = "Canceled"});
            orders.Add(new Order(){Year = 2020, Status = "Shipped"});            

            
            var result = orders
                .GroupBy(x=> new {x.Year, x.Status})
                .Select(y => new 
                {   
                    Year = y.Key.Year,
                    Status = y.Key.Status,
                    Count = y.Count()                      
                }).ToList();
            foreach (var item in result)
                {
                    Console.WriteLine(string.Format("{0} {1} {2}",item.Year,item.Status, item.Count));
                }
        }
    }
    public class Order
    {
        public int Year {get;set;}
        public string Status {get;set;}
    }
...